DxOpalの画像読み込みの改良案を考えてみた

DxOpalでの開発がちょっと詰まっている。次のシーンに移動するときに画像の追加読み込みが出来ないからだ。かと言ってゲーム開始時にすべての画像を読み込むのも大規模なゲームになってくると現実的ではなかったりする。
というわででリソースの読み込みと管理を行っているRemoteResourceクラスを追加読み込みができるように改造してみた。……してみたがイマイチいけてない。
なにが問題なのか考えた結果、まずリソース読み込みと管理が一緒になっているのが個人的に好きではない。やっぱりリソースは自分で管理したいのだ。さらにImageクラスの基底になっているのも依存性が高くて不安になる。
そこでこの際、自分ならどんな仕様だったら使いやすいのかをイメージしてなるべくシンプルに実装してみる。
まずなるべくDxRubyの文法に近づけたいので。

image = Image.load('sample.png')
Window.loop do
  Window.draw(x, y, image) 
end

上記と同じコードが動くようにする。ただし画像の読み込みは非同期なので、最初は1×1の空の画像が画面に表示されて、読み込み後に改めて画像が表示されるようになる(もうちょっと作り込めば待ち時間のないスムーズなインターフェースとか作れそうだが話が脱線するので次回)。
ちゃんと読み込んだ後に処理させたい場合はloadedフラグを追加したので

if image.loaded?
  Window.draw(x, y, image)
end

こういう風に制御できるし、全部の画像を読み込んだあとに処理させたい場合は

resources = []
resources << Image.load('test.png')
resources << Image.load('test2.png')
Window.loop do
  if resources.all?(&:loaded?)
    ...
  else
    Window.draw_font(0, 0, "loading...", Font.default)
  end
end

なんてこともできる。
あとはこれを実際にゲーム開発で使ってみて良いか悪いか判断してみようと思う。

0