「Box2D」カテゴリーアーカイブ

Box2D 2.0.0のサンプルを2.1aで動かすための注意点

EaselJSのお勉強でBox2DWebを触ったので、その先を進めようとしたら意外とサンプルがない。JS版も基本的にBox2DFlashAS3と同じらしいんで、サンプルを漁ってみたもののどれも古くてそのままでは動かない。なんとか動くようにできたけど、色々変わってる点もがあり、それについて書かれた日本語ページを見つけられなかったので、今後のためにメモ。

※ Box2DFlashAS3 2.0.0 を 2.1a で動かすための変更点です。
まず、古いサンプルだとパブリッシュ設定がFlash Player9 になってる場合が多いけど、これだとこんなエラーが出ます。
行 8711046: 型が見つからないか、コンパイル時定数ではありません : b2Fixture。
これはFlash Player 10以上にすることで解決します(Flash Player11.4+Flash CS6で確認)。
次に Box2D.Dynamics.b2world クラスの b2wolrd メソッドの引き数が変わっています。
(2.0.0)world = new b2World(worldAABB, gravity, true);
(2.1a )world = new b2World(gravity, true);
それから Box2D.Collision.Shapes 配下のクラスが変わっています。
(2.0.0)b2CircleDef >> (2.1a)b2CircleShape
(2.0.0)b2PolygonDef >> (2.1a)b2PolygonShape
そして Box2D.Dynamics.b2world クラスの bodyを作る為のメソッドが変わっています。
(2.0.0)var floor:b2Body = world.CreateStaticBody(floorBodyDef);
(2.1a var floor:b2Body = world.CreateBody(floorBodyDef);
2.0.0では、作るbodyの種類毎に world.CreateStaticBody、world.CreateDynamicBody とメソッドがあったようですが、2.1a では1つになっています。で、staticとかdynamicの指定は、Box2D.Dynamics.b2BodyDef で設定するようになっています。
2.1a 
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.type = b2Body.b2_dynamicBody;
また 2.0.0 では Box2D.Collision.Shapes に指定していた密度、摩擦係数、弾性(density,friction,restitution)は、2.1a では Box2D.Dynamics.b2FixtureDef に指定します。
(2.0.0)
var wheelShape:b2CircleDef = new b2CircleDef();
wheelShape.radius = 0.15;
wheelShape.density = 1;

(2.1a 
var wheelfixtureDef:b2FixtureDef = new b2FixtureDef();
wheelfixtureDef.shape = wheelShape;
wheelfixtureDef.density = 1;
よくサンプルで使われている Box2D.Dynamics.b2DebugDraw もメソッドが大幅に変わっています。「m_…」が「Set…」に変更されています。
(2.0.0)
debugDraw.m_sprite = this;
debugDraw.m_drawScale = DRAW_SCALE;
debugDraw.m_fillAlpha = 0.3;
debugDraw.m_lineThickness = 1;
debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;

(2.1a 
debugDraw.SetSprite(this);
debugDraw.SetDrawScale(DRAW_SCALE); 
debugDraw.SetFillAlpha(0.3);
debugDraw.SetLineThickness(1)
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit | b2DebugDraw.e_pairBit);
最後に、物理シミュレーションを更新するための world.step() は、引数が2つから3つに変更されています。
(2.0.0)world.Step(1 / 24, 10);
(2.1a )world.Step(1 / 24, 10, 10);
そして Box2D.Dynamics.b2DebugDraw を使う際は、world.Step() を呼び出したあとに・・・
world.DrawDebugData();
が、必要なようです。
とりあえずココまでの対処で、2.0.0 のサンプルを 2.1a で動かすことができました。まだ理解し切れてるとはいえないので、誤り等ありましたらご指摘下さい。下記サンプルを書き換えて動作確認しました(MaxOSX10.7.6+Flash CS6+Box2DWeb 2.1a)。感謝。
【追記】2013.7.21 東京ひよこの会 第5回で、この内容を発表した際に見つけた誤りを修正しました。
(誤)(2.0.0)b2CircleDef >> (2.1a)b2PolygonShape
(正)(2.0.0)b2PolygonDef >> (2.1a)b2PolygonShape