Window.loopを複数置く
あと丁度1ヶ月でRuby2.2が出る。んじゃないかと思う。
そうするとDXRubyもそれに対応してビルドしてリリースしないといけないのだが、次はTypedData化しないといけなくなるのでそのままビルドするわけにもいかず。つっても警告はビルド時の話だと思うので問題は無いのかもしれないが。まさか実行時じゃないよね?そのへんソース見てもよくわかんなかったんだけども。
さて、DXRuby1.5devのほうはとりあえずTypedData化してあって、内部Unicode化した(時にめんどくさいという)都合でRuby1.8ではビルドできなくなっていて、でも一応1.9ではビルドできるようにした。1.9ではTypedDataが使えないのだが、条件コンパイルでアレコレやってなんとか両対応である。あと、一部のクラスについてはRGenGCにも対応してライトバリアした。たぶんちゃんとできてるんじゃないかと思う。
これらを突っ込んだDXRuby1.4.2をRuby2.2対応版としてリリースしようと考えている。すなわち対応するRubyバージョンは1.9〜2.2となる。Ruby2.2はインクリメンタルGCになるので、アクションゲームを作る場合にGCの停止時間のせいで処理落ちというパターンを心配しなくてよくなるのでオススメである。
という感じで読みにくい文章を書いて読者をふるい落としておいて、ここからDXRuby1.4.2に加える変更の話。
DXRubyはマイナーバージョンアップでもメソッド追加したり内部構造を変えたりとやりたい放題であるが、クラスの追加はしないという程度には自重している。なので1.4.2でもクラスの追加は無いが、やっぱり若干のメソッド追加はする。と共に、無意味にかかっていた制限を解除していこうと思っている。
無意味にかかっていた制限というのは、例えばタイトルに書いてあるようにWindow.loopが1回しか置けないというような話。これは初期の頃の作りが原因でしょうがなく制限にしてあったのだが、1.4.1の内部構造変更に伴って複数置けるようなコードになっていたので、シンプルに制限を撤廃、合わせて他のメソッドどもも変なことにならないように調整しようと。
これにより、以下のようなコードが書けるようになる。
loop do Window.loop do # このへんにタイトル描画のコード break if Input.key_push?(K_SPACE) # スペースキーでゲームスタート Window.close if Input.key_push?(K_ESCAPE) # エスケープキーで終了 end break if Window.closed? Window.loop do # このへんにゲーム本体のコード Window.close if Input.key_push?(K_ESCAPE) # エスケープキーで終了 end break if Window.closed? end
Window.closeは今回の追加メソッドで、見たまんまウィンドウを閉じる。Window.closed?は閉じられている場合にtrueを返す。んで、Window.loopはbreakしてもウィンドウを閉じず、ユーザやコードによってウィンドウが閉じられた場合に自動的に終了する。
Window.loopが1個のときの動作は従来と同様だが、それを複数置いてさらにloopで繰り返すことができるようになる。これにより、複数のシーンを持つ簡単なプログラムが、Sceneクラスなどの導入をしなくても書けるようになる。ぶっちゃけ俺が欲しかった機能だなこれは。
まあ、他にもちょいちょい規制緩和のネタを検討してて、ちょっとでも扱いやすくなってくれればいいなあー、と。