2/9 Box2DFlashAS3 メモ2

Box2DFlashAS3

今日はこのサイトこのサイトを使ってさらにBox2DFlashAS3に関する認識を深めていきたいです。

まずは物理エンジンの設定

[cc lang="actionscript"] var worldAABB : b2AABB = new b2AABB(); world.lowerBound.Set(-100,-100); world.upperBound.Set(100,100);

var gravity:b2Vec2 = new b2Vec2(0,9.8);

_world = new b2World(worldAABB,gravity,true); [/cc]

b2AABBクラスをインスタンス化して、シミュレーションの範囲を作り、lowerBound.Set(左上の座標) , upperBound.Set(右下の座標)で設定している。 注意点はこの際の数値はPixelではなくM(メートル)で表示されています。これは後で適正な大きさに設定しています。

gravityは物理空間の重力を表しています。 b2Vec2は第一引数に水平位置、第二引数に垂直位置がしていできます。今回は重力ということで垂直位置にだけ値が(メートル)で設定されています。

b2Worldは物理空間を作っています。 第一引数は、b2AABBオブジェクト 第二引数は、シミュレーションに常時かかる力を表すb2Vec2オブジェクト 第三引数は、doSleepを有効にするかどうか。よほどのことが無い限りtrueにしておく。

物体の作成

固定された静体と、動ける動体とあるが基本作成方法は同じです。

まずは静体の作成。 [cc lang="actionscript"] var bdFloor:b2BodyDef = new b2BodyDef(); bdFloor.position.Set(5.5 / 2, 3);

        var pdFloor:b2PolygonDef = new b2PolygonDef();
        pdFloor.SetAsBox(2, 0.15);

        var bFloor:b2Body = _world.CreateBody(bdFloor);
        bFloor.CreateShape(pdFloor);

[/cc]

b2BodyDefを使い物体の位置を指定します。

b2SpriteDefを使い物体の形を指定します。 b2SpriteDefには、四角形を表すb2PolygonDefや、丸を表すb2CircleDefなどがあります。 b2PolygonDefの場合はSetAsBox()を使い範囲を設定します。 b2CircleDefの場合はradiusで半径をしていします。

最後にb2Bodyを使って、b2BodyDef、b2SpritDefを当てはめ物体を生成します。

続きまして動体を見てみましょう。 [cc lang="actionscript"] var bdBox:b2BodyDef = new b2BodyDef(); bdBox.position.Set(5.5 / 2, 1);

        var pdBox:b2PolygonDef = new b2PolygonDef();
        pdBox.SetAsBox(0.3, 0.2);
        pdBox.density = 1;    //密度(1平方メートルあたりの重量(kg))

        _bBox = _world.CreateBody(bdBox);
        _bBox.CreateShape(pdBox);

        _bBox.SetMassFromShapes();

[/cc]

静体と同じようにb2BodyDef,b2SpriteDef,b2Bodyクラスを使っています。

違いは質量を設定している所です。 densityは物体の密度を表しています。SetMassFromShapes()を使って質量を有効にしています。

実際に画面に表示する [cc lang="actionscript"]

 var dd:b2DebugDraw = new b2DebugDraw();
 dd.m_sprite = this;
 dd.m_drawScale = 100;      //1m を100ピクセルにする
 dd.m_fillAlpha = 0.3;        //塗りのアルファ値
 dd.SetFlags(b2DebugDraw.e_shapeBit);      //物体を表示する設定に
 _world.SetDebugDraw(dd);      //物理ワールドにセット

        //▼イベントリスナーの追加
        addEventListener(Event.ENTER_FRAME, _enterFrameHandler);
    }

    //▼イベントリスナー定義
    private function _enterFrameHandler(eventObj:Event):void {
        _world.Step(1 / 24, 10);//物理シミュレーションの更新

} [/cc]

b2DebugDrawクラスを使って作成した物体を画面に表示していきます。 イベントリスナーではStep()を使って物理的な動きを適切に処理しています。 第一引数は更新する時間(秒)を表す数値 第二引数は精度を表す整数値。