いままでなんか難しそうだな~と思っていたが、ちょくちょくWEBサイトを見ていると使用されているところを見始めたのでさっそくはじめてみました。
注意しておきたい点はFlashはピクセル単位で扱うがBox2Dでは
長さ メートル
重力 キログラム
時間 秒
で扱うので間違えないように
まず必要な基本的な設定の順番
①物理エンジンワールドのセット
まずは物理エンジンの影響する範囲を決める
必要なクラス b2AABB
var worldAABB:b2AABB=new b2AABB();
worldAABB.lowerBound.set(-100,-100)
worldAABB.upperBound.set(100,100);
b2AABBとは、斜めになっていない、軸にそった長方形で左上が「lowerBound」、右下が「upperBound」になる。
上記の例だと左上が「-100,-100」で右下が「100,100」となるので、基準点は範囲の中心点からの距離となる。
つまり上記の例だと縦横200m(メートルということになる)
②重力の設定
物理エンジンの範囲の中で使用する重力の数値を指定する。
必要なクラス b2Vec2
var gravity:b2V2c2=new b2Vec2(0,10) //第一引数はベクトルX、第二引数はベクトルY
③物理エンジン全体のセットアップ
重力を設定したら物理エンジン全体のセットアップ
必要なクラス b2World
world=new b2World(worldAABB,gravity,true) //第一引数は物理ワールド 第二引数は重力、第三は不明
④床の設定 床の場所の設定
ここまでは物理の世界を作成しただけなのでここから物体を作成していく。まずは床から。
必要なクラス b2BodyDef
var floorBodyDef:b2BodyDef=new b2BodyDef();
floorBodyDef.position.Set(2.5,3)
*ここでちょいと重要だと思う点
床の場所を設定するには「position.Set」で指定するのだが、その範囲。
床の場所は第一引数に「左からの距離(メートル)」、第二引数「上からの距離(メートル)」
上記の例だと左から2.5メートル 上から3メートルの位置で位置を示すのは床の中心座標であって床の左上の座標でないので注意が必要
⑤床の形を設定
必要なクラス b2PolygonDef
var floorShapeDef:b2PolygonDef=new b2PolygonDef();
floorShapeDef.SetAsBox(2,0.1);
SetAsBoxメソッドは、まっすぐな長方形を定義する。引数には長方形の縦横大きさの半分を指定。
上記の例だと第一引数の幅(X軸)が2→4メートル、縦(Y軸)が0.1→0.2メートル(20センチ)
考え方として、床の中心位置(b2BodyDef)からの幅と高さと考える。
⑥床の物理ワールド内に設置する
必要なクラス b2Body
var floor:b2Body=world.CreatBody(floorBodyDef)
floor.CreateShape(floorShapeDef);
まずは「CreateBody」で床の位置(floorBodyDef)を設定する。
すると b2Bodyクラスのインスタンスが返ってくるのでそのインスタンスの「CreateShape」メソッドで床の形(floorShapeDef)を設定する。
⑦箱の位置の設定
基本的に箱と同じ
必要なクラス b2BodyDef
var bodyDef:b2BodyDef=new b2BodyDef();
bodyDef.position.Set(2.5,1);
床の設定と同じように左から2.5メートル、1メートル。つまり床の上から2メートルの位置にある。
⑧床の形の設定
必要なクラス b2PolygonDef
var shapeDef=new b2shapeDef();
shapeDef.SetAsOrienteBox(0.3,0.2,new b2Vec(0,0),0.8);
SetAsBoxからSetAsOrientedBoxに変っているが、SetAsBoxは「まっすぐ」な形が作れるが、SetAsOrientedBoxを使用すると「傾いた長方形」が作成できる。
引数は床と同じで中心点を基準とする 0.3→0.6(60cm)
第一引数:幅 0.3→0.6(60cm) 第二引数:高さ 0.2→0.4(40cm)
第三引数:回転させるときの中心座標 b2Vec2を使用する
第四引数:傾ける角度をラジアン単位で指定 0.8だと約45度
⑨箱の重さを設定
床だと上記までだったが箱は移動するのでさらに設定する。
shapeDef.density=1; //b2shapeDefのプロパティ「denstiy」で設定
densityは密度を指す。値1は1平方メートルの物体の重さが1キロとなる。
今回の箱は0.6×0.4で0.24となるので 今回設定した1は0.24キロとなる。
⑩箱の反発係数を設定する
跳ね返る数値を設定する。
shapeDef.restitution=0.2; //restitutionプロパティで設定する。
0だとまったく跳ね返らない 1だと永久に跳ね返る
⑪箱を物理ワールドに設定する。
床の時と同じ設定
var body:b2Body=world.CreateBody(bodyDef);
body.CreateShape(shapeDef);
body.SetMassFormShapes(); //SetMassFromShapesで重さを設定。指定した密度はここで反映されます。
⑫DebugDrawの設定
床と箱を設置したところでそれらを描画する必要がある。
必要なクラス b2DebugDraw
var debugDraw:b2DebugDraw=new b2DebugDraw();
debugDraw.m_sprite=this; //描画するオブジェクトを示す??
debugDraw.m_drawScale=100 //1メートルを100ピクセルにする
debugDraw.m_fillAlpha=0.3 //透明度の設定
debugDraw.m_linethickness //線の太さ
debugDraw.m_drawFlags=b2DebugDraw.e_shapeBit; //b2DebugDrawのメソッド「e_shapeBit」を使用
//
//最後にworldのsetDebugDrawプロパティにdebugDrawを指定する。
world.setDebugDraw(debugDraw)
b2DebugDraw.e_shapeBitの「e_shapeBit」のほかにもいくつかメソッドが用意されているがどうやら「e_shapeBit」が箱と床と描画してくれてるようだ。その他にも
e_centerOfMassBit
e_aabbBit
e_coreShapeBit
e_jointBit
e_obbBit
e_pairBit
がある。
⑬物理エンジン内の時間を進める
EnterFrameメソッド内に記述すること
world.Step(1/24,10); //worldのStepのプロパティで設定
第一引数は時間を進める単位。 上記の例だと1フレームで24秒。
第二引数はシュミュレーションの精度。マニュアルだと10を推奨。
次の項目で全体のスクリプトを載せます