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()を使って物理的な動きを適切に処理しています。 第一引数は更新する時間(秒)を表す数値 第二引数は精度を表す整数値。