DxOpalの新しい画像読み込み処理を実装
経過報告
前回のDxOpalの画像読み込みの改良案を考えてみたの構想を実装して、実際にゲーム開発で使い勝手を試してみた。
使い方は前回説明した通り
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からフォークして独自の改良を加えてるのだが、こういうのは本家へフィードバックするべきなのだろうか?






ディスカッション
コメント一覧
Image.loadとImage#loaded?、良いと思いました。Window.load_resourcesは画像が少ないときにしか使えないので、何かしら回避策が欲しいなと思っていたのでした。またプルリクエストを作ってもらえれば取り込みます。
onloadはちなみにどういうときに使うのでしょうか?
とりあえず一か月位自分で使ってみて問題なかったのでプルリク作成します。
onloadはとりあえず用意したものの、今のところ使い道はないですねー。