画像分割機能

DXRuby1.0.1では1つの画像を複数に分割して読み込む機能がある。
あるのだが、縦横の数を指定するから、すべて同じ大きさになるのが制限事項となる。
1つの画像に大きさがマチマチのデータが混在してることを想定していなかったのだが、ゲームの素材を調べていたら、そういうものが見つかってしまった。
これを使おうと思ったら現状のDXRubyでは対応できないから、画像ファイルを自分で分割しないといけない。


DXRubyではImageオブジェクトは内部にテクスチャ情報の構造体へのポインタを持っている。
2階層になっているのは、1つのテクスチャを複数のImageオブジェクトが参照するからだ。
ImageオブジェクトがGCに回収されたら参照カウントを減らして、0になったらテクスチャ情報も解放される。
Ruby側からテクスチャ情報を直接参照することは今のところできないが、できるようにすれば、読み込んだ画像からImageオブジェクトを生成することはできそうだ。
しかしTextureクラスなどを作ってしまうとImageクラスとの関連がややこしくなる。
きちんと理解せずに使うと困ったことになるだろう。


実は、いまの仕組みでも裏ワザ的な方法を使えばできないことはない。
Imageクラスのメソッドのx、y、width、heightが表すのはテクスチャ内での座標だ。
このメソッドを残すかどうかでずいぶん悩んだのだが、結局残してあって、サンプルのミニレーシングはこの機能を使っている。
これを使えば、とりあえず適当な数に分割してImageオブジェクト配列を作ってから、それぞれのテクスチャ内座標をずらして思い通りの位置・サイズに変更できる。
Imageオブジェクト配列の数は、縦横のどっちかを1にすれば自由にできるから、問題は内部実装に依存した使い方であって極めてわかりにくいというところだけだ。


また、この機能はかなり微妙なもので、たとえばテクスチャ内座標をずらして中身を書き変えると、他のImageオブジェクトの画像も書き変わる。
そういうものだから消そうかと考えたわけなのだが、基本的に使う人があまり想定できなく、そんな変なものを使うぐらいなのだから、少しは理解しろ、ということで残した。


たとえばテクスチャ情報にファイル名を持たせて、Imageクラスのメソッドにファイル名と座標・サイズを渡してImageオブジェクトを1つ生成するようなものを追加する。
検索して同じファイル名があった場合は同じテクスチャを共有する。
別のImageオブジェクトが同じ情報を参照するのは、Ruby的には自然だ。
そうなってくるとRubyのほかのデータのように、dupもできるようにしないといけない。
作るのは少し面倒だ。


まあ、そんなに重要なものでもないから、とりあえずは放置しとくか。
対策方法だけは検討しておこう。