DXRuby1.5.7dev

今回はバグ修正と仕様変更と、RenderTarget#ox/oyの導入である。

バグ修正は結構大きい問題の対処で、Image.load_tilesの計算ミスと、デバイスロスト時にコケる問題。デバイスロストはフルスクリーンにしてALT+TABで発生するが、俺自身フルスクリーンで動かさないから気にならなかったのだな。このあいだのマップエディタがフルスクリーン仕様だったからこれはちょっと困るなーと言うことで急いで直した次第。
Image.load_tilesは致命的もいいところで、描画時の位置計算を高速化するためにテクスチャのサイズをfloatで持っていたらfloat/floatの演算で誤差が出てサイズがおかしくなったという話。そもそもImage.load_tilesの引数で数を指定するところが間違っていて、サイズ指定にしておけば問題は出なかったのではないかと考えている。そこを今から直すわけにもいかんが。

仕様変更はdraw_font_exのaaスイッチと、Window.autocall。aaスイッチはデフォルトの動きをサイズ依存としていた(Window.draw_fontの動き)が、やっぱり互換性を重視してデフォルトtrueとした。Window.autocallは使いにくかったので変更。ProcとかMethodとか初心者が見ても意味わからんかなーと思ったのだが、意味わからん人は使わなければよいということで。必須機能でもないし。

さて、RenderTarget#ox/oyが今回のミソで、これは描画される画像の座標の基点位置をずらすことができる機能である。ox,oyを5,5にしたら、selfの左上隅座標が5,5として全体をずらしたように描画される。Spriteの描画も影響を受ける。これにより、画面サイズを超えるマップに配置されたオブジェクトなどを、画面座標ではなくワールド座標で管理することができるようになる。
また、RenderTarget#draw_tileも影響を受けるわけだが、マップ描画の描画基点がずれても意味が無さ過ぎるので、各パラメータにnilを指定するとself全体にox/oyの位置のマップが描画されるようにした。だいたいマップは現在の機能セット的にRenderTarget全体に描画するものだと思うわけで、もともとこういう動きにしておけばよかったのである。まあ、RenderTargetが無い時代のメソッドだからそういうわけにもいかんかったわけだ。

これにてだいたい想定していた機能の実装はできたような感じで、あとはIMEをどうするかといったところとなる。3Dについては何をどう提供すればいいのかというイメージが定まらずに手が付けられていない。現代的な機能セットの実装は手間が大きいのと使用感の統一という意味で厳しいが、簡潔な機能を簡潔に、というのもなかなか難しい。表現力の拡張的な何かが作れればいいのだが。

先の予定は状況によりいろいろ変わるが、とりあえず現在の1.5devからのバックポートをごっそり入れて1.4.1を出しておこうかと。いくつかの機能は削ることになるが、たぶんかなり入る。一応Ruby2.1でコンパイルして動くようにもしておく。気が向いたらRuby2.1用も出すだろう。ここまではRuby1.8用にもコンパイルできるソースになっているはずなので、Ruby1.8用も作っておこうと思う。
正式版のDXRuby1.6.0は今後を考えてソースに手を入れて、Ruby2.0以降でしか使えないようにしようと思っている。古いコードはばっさり捨てて、新しい仕様に合わせて。できたらRGenGCフレンドリーな感じに。そういうことで1.5.7devはRuby2.0用しか作っていない。1.9用が欲しい人は言ってくれれば作れるので作る。
まあ、予定は未定であり、予告なしに変更されうる。いま考えてるのはそんな感じ、ということで。