Sha256: 75010bfae19ae9e596611bb96037c19fd46afd10184e7810b93001ed41025559

Contents?: true

Size: 1.93 KB

Versions: 6

Compression:

Stored size: 1.93 KB

Contents

module DXOpal
  # A base class for resources acquired through JS Promises.
  # Provides `<klass>.register` and `<klass>[name]`.
  # A subclass must impelment `<klass>._load`.
  #
  # TODO: better name? (SoundEffect is not actually 'remote')
  class RemoteResource
    # List of registered resources (Contains path_or_url)
    @@resources = Hash.new{|h,k| h[k] = {}}
    # Contains promises
    @@promises = Hash.new{|h,k| h[k] = {}}
    # Contains instances of Image, Sound
    @@instances = Hash.new{|h,k| h[k] = {}}

    # Subclasses of RemoteResource
    @@klasses = {}
    def self.add_class(subklass)
      @@klasses[subklass._klass_name] = subklass
    end

    # Reserve instance generation
    def self.register(name, *args, &block)
      @@resources[_klass_name] ||= {}
      @@resources[_klass_name][name] = [block, args]
    end

    # Return instance of loaded resource (call on subclasses)
    def self.[](name)
      if (ret = @@instances[_klass_name][name])
        return ret
      else
        raise "#{_klass_name} #{name.inspect} is not registered"
      end
    end

    # Called from Window.load_resources
    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

    # Load actual content (defined on subclasses)
    # Return `[instance, promise]`
    def self._load(*args)
      raise "override me"
    end

    # Return a string like "Image" or "Sound"
    def self._klass_name
      return self.name.split(/::/).last
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
dxopal-1.5.2 lib/dxopal/remote_resource.rb
dxopal-1.5.1 lib/dxopal/remote_resource.rb
dxopal-1.5.0 lib/dxopal/remote_resource.rb
dxopal-1.4.4 lib/dxopal/remote_resource.rb
dxopal-1.4.3 lib/dxopal/remote_resource.rb
dxopal-1.4.2 lib/dxopal/remote_resource.rb