class DXOpal::RemoteResource

A base class for resources acquired through JS Promises. Provides `<klass>.register` and `<klass>`. A subclass must impelment `<klass>._load`.

TODO: better name? (SoundEffect is not actually 'remote')

Public Class Methods

[](name) click to toggle source

Return instance of loaded resource (call on subclasses)

# File lib/dxopal/remote_resource.rb, line 28
def self.[](name)
  if (ret = @@instances[_klass_name][name])
    return ret
  else
    raise "#{_klass_name} #{name.inspect} is not registered"
  end
end
_klass_name() click to toggle source

Return a string like “Image” or “Sound”

# File lib/dxopal/remote_resource.rb, line 63
def self._klass_name
  return self.name.split(/::/).last
end
_load(*args) click to toggle source

Load actual content (defined on subclasses) Return `[instance, promise]`

# File lib/dxopal/remote_resource.rb, line 58
def self._load(*args)
  raise "override me"
end
_load_resources(&block) click to toggle source

Called from Window.load_resources

# File lib/dxopal/remote_resource.rb, line 37
def self._load_resources(&block)
  @@resources.each do |klass_name, items|
    klass = @@klasses[klass_name] 
    items.each do |name, (block2, args)|
      if !@@promises[klass_name][name]
        instance, promise = klass._load(*args, &block2)
        @@instances[klass_name][name] = instance
        @@promises[klass_name][name] = promise
      end
    end
  end
  promises = @@promises.values.flat_map(&:values)
  %x{
    Promise.all(#{promises}).then(function() {
      #{block.call}
    });
  }
end
add_class(subklass) click to toggle source
# File lib/dxopal/remote_resource.rb, line 17
def self.add_class(subklass)
  @@klasses[subklass._klass_name] = subklass
end
register(name, *args, &block) click to toggle source

Reserve instance generation

# File lib/dxopal/remote_resource.rb, line 22
def self.register(name, *args, &block)
  @@resources[_klass_name] ||= {}
  @@resources[_klass_name][name] = [block, args]
end