DxOpalの新しい画像読み込み処理を実装

経過報告

前回のDxOpalの画像読み込みの改良案を考えてみたの構想を実装して、実際にゲーム開発で使い勝手を試してみた。

追加したソースコード(GitHub)

使い方は前回説明した通り

image = Image.load('sample.png')

Window.loop do
  Window.draw(x, y, image) # 読み込み中は空の画像が表示される
end

読み込みが終わったかどうかはloaded?で判断し、
さらにonloadブロックで読み込み後に一度だけ処理を記述することもできるようにした。

# 読み込みが終わってるか?
if image.loaded?
  ...
end

# 読み込み後に一度だけ処理
image.onload do
  ...
end

リソース管理

前回、リソース管理部分は分離して自由に管理したいと言っていたが、まだ納得がいく実装は作れていない。
とりあえず現在私が使っているリソース管理は以下のようになっている。

# リソース管理
class ResourceHash < Hash
  def all_loaded(&block)
    promises = values.map(&:promise)
    %x{
      Promise.all(#{promises}).then(function() {
        #{block.call}
      });
    }
  end
end

# 使用例
Resources = ResourceHash.new
Resources[:player] = Image.load('player.png')
Resources[:enemy] = Image.load('enemy.png')
Resources.all_loaded do
  Window.loop do
    Window.draw(x, y, Resources[:player]) 
  end
end

このクラスをアプリ全体用と各シーン用に配置して管理して。ゲーム開始時とシーン開始時にロード画面を表示するようにした。

今後

こうやって本家DxOpalからフォークして独自の改良を加えてるのだが、こういうのは本家へフィードバックするべきなのだろうか?

0