ChipmunkとDXRuby

2D物理演算ライブラリであるChipmunk2DをDXRubyと連携させる方法を考えている。
Chipmunkは普通にRubyバインダで使えるし、自分でそれらをやりとりするコードを書けばゲームだって作れる。たとえばPoxBulletNightとかはそうやって作られてる。
ただ、Vectorクラスが両方別々に存在するとか、衝突判定も別々に存在するとか、描画系と演算が分離しているというのはなにかと面倒である。
もしDXRubyにChipmunkをシームレスに統合できたらキモチイイだろうなあ、なんて思っていたのだが、まず使ったことすらないライブラリなわけで妄想もたいがいにしろと言う感じである。
やるとすればSpriteに物理演算を統合という形になるわけだが、技術的な部分はともかくとして、仕様的な部分をどのようにするかが最大の問題となる。具体的にどんな機能があって、何がめんどくさくて、どのように使うことができればいいのか、というのは、実際にやってみないと何とも言えない。
ということで少しいじってみた。

ソースはこちら。1.5devじゃないと動かないかもしれない。
https://gist.github.com/mirichi/3672a136c62d0faab4da
野良ビルドのRuby2.0(mingw32)用のバイナリ(6.1.3.0.rc1)はこちら
http://dxruby.sourceforge.jp/files/chipmunk.so

とりあえずこのぐらい動かしてみた感想としては、パラメータ類をnewのハッシュ引数にして少し説明を書けばいろいろ隠蔽してわりと簡単に使えるんじゃないかな、という感じ。
ジョイント系のオブジェクトはまだ未実装なので見た目が作れない。これをするには新しくそれ用のクラスを作らないといけないんじゃないかと思っている。
あと、衝突判定まわりはSpriteそのものなのでChipmunk外のものとの判定はそのままいける。ただし、Chipmunk内での衝突検知はSpriteとしては当たっていない状態にされてしまうから、そっち用のものを用意しないといけない。これはたぶん、Chipmunkの衝突判定処理をラップしてSpriteの動きに重ねてしまえば普通に使えるようになるんじゃなかろうか。とか。
マウスで掴んで動かすとかキャラをカーソルキーで動かすとかの処理はまた別のノウハウとしてサンプルを用意する必要がありそうだ。

こういう感じでRubyのコードでそれなりに使えるのであれば、わざわざCでバインダを作る必要は無いかもしれない。えらい大変そうだし。でもこのレベルでもまだ微妙に納得いかない動きをしてたりするわけで、まだまだ使い込んでみないとどこまでできるかわからん感じである。
まあ、気長に。