2D物理エンジンをRubyに移植してみました

http://github.com/technohippy/Pongo/tree/master

先週のRubyKaigi2009で「Rubyで*1何か作りたい欲」を激しく刺激されたので、前から欲しかった物理エンジンをRubyに移植してみた。本気アプリならChipmunkのRubyバインディングでFAっぽいけど、ピュアRubyのもあればあったで嬉しいっしょ。

物理エンジンと言えば前にBox2DのAS3版をJSに移植したことがあるんだけど、Rubyの場合はJSみたいに単純に置換ってわけにいかないから難度高すぎ。30分ソース眺めて諦めた。で、もうちょっとシンプルそうなエンジンということで移植のターゲットとしてはAPE (Actionscript Physics Engine)を選択。ちなみに今回は置換じゃなくてちゃんと目視&手打で移植したっす。

移植してみて分かったのは、APEはホントにシンプル。Box2Dにあった便利機能とかぜんぜんないので、ちゃんとしたゲームを作るならどう考えてもBox2D移植するのが正解。ただ、いろいろ弄りながら物理エンジンを勉強しようと思ってる自分には、これはこれでいい選択だったかなと。

レンダラは入れ替え可能だけど、今のところShoes用の適当なのしか用意してない。触ってみたい人は観念してShoes2をインストールすればいいと思う。Shoes可愛いよShoes。いずれSDLとかTkキャンバスを使ったレンダラを追加するつもりなので、Shoesなんて入れてらんねーって人は一週間くらい待てばいいことあるかも。

ちなみに名前のPongoはオランウータンのこと。検索したらRed Apeとも呼ばれてるらしいので赤いAPEってことで。最初は単純にAPEの頭にRをつけようかと思ったけどそれはさすがに、ねぇ・・・。

...

例

require 'pongo'
require 'pongo/renderer/shoes_renderer'
require 'pongo/logger/shoes_logger'
include Pongo

Shoes.app :width => 500, :height => 350 do
  # レンダラとかロガーとか重力とかいろいろ設定
  APEngine.setup
  APEngine.renderer = Renderer::ShoesRenderer.new(self)
  APEngine.logger = Logger::ShoesLogger.new(self)
  APEngine.add_force VectorForce.new(false, 0, 2)


  # パーティクルはグループに登録しないと駄目らしいので準備
  default_group = Group.new
  default_group.collide_internal = true

  # 落下物。箱とか丸とか
  default_group.add_particle(RectangleParticle.new(275, 90, 20, 30))
  default_group.add_particle(CircleParticle.new(255, 150, 3)) 

  # 地面
  default_group.add_particle(RectangleParticle.new(250, 250, 300, 50, :fixed => true))

  # グループをエンジンに登録
  APEngine.add_group(default_group)

  # 実行
  animate(10) do |anim|
    APEngine.step
    APEngine.draw
  end 
end

*1:Railsじゃなくて