Box2DでActionScript物理プログラミング

第2回 物理エンジンをセットアップし,箱を落とすFlashを作る

この記事を読むのに必要な時間:およそ 4 分

重力を定義する

重さと時間の話が出てきたところで,重力を定義します。重力は一般的に9.81メートル毎秒毎秒ですが,ここでは10としておきます。

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

重力はベクトルを表すb2Vecクラスで定義します。重力は下を向いているので,ベクトルのX成分は0,Y成分は10となります。

物理エンジン全体のセットアップ

最後に,ここまで定義してきたworldAABBとgravityを使って物理エンジン全体をセットアップします。

world = new b2World(worldAABB, gravity, true);

Box2Dでは,物理エンジン全体をワールドと言い,b2Worldクラスで表します。コンストラクタにワールドの範囲と重力を指定すれば,セットアップ完了です。

床の設置

物理エンジンをセットアップしただけの状態は,いわば世界に何も無い状態です。今からこの世界に物を設置していかなければなりません。冒頭でお見せしたとおり,これからこの世界に床と箱を設置するのですが,まずは床から設置していきましょう。

床の場所とサイズ

床の場所とサイズ

床の場所を定義する

床の場所は,b2BodyDefクラスを使って定義します。

var floorBodyDef:b2BodyDef = new b2BodyDef();
floorBodyDef.position.Set(2.5, 3);

floorBodyDefというインスタンスを作り,positionに床の場所(左から2.5m,上から3m)を設定するだけです。なお,このpositionに指定するのは床の中心座標です。床の左上の座標ではないので注意してください。

床の形を定義する

床の形は,b2PolygonDefクラスを使って定義します。

var floorShapeDef:b2PolygonDef = new b2PolygonDef();
floorShapeDef.SetAsBox(2, 0.1);

b2PolygonDefは,その名のとおり色々な多角形を定義するのに使えます。SetAsBoxを使えば,まっすぐな長方形を定義できます。引数には長方形の大きさの半分の値を指定します。

ここで作りたい床のサイズは幅4m,高さ(厚さ)20cmなので,その半分の2と0.1を指定します。少しややこしく感じられるかもしれませんが,最初に指定した床の中心位置からの幅と高さだと思えば分かりやすいと思います。

床を設置する

ここまで定義してきた位置と形の情報を使って,床をワールド内に設置します。

var floor:b2Body = world.CreateStaticBody(floorBodyDef);
floor.CreateShape(floorShapeDef);

worldのCreateStaticBodyメソッドを呼ぶと,b2Bodyクラスのインスタンスが返されます。これがワールド内に設置された床です。ただし,このままでは床が形を持っていない状況なので,CreateShapeで形を指定します。

CreateStaticBodyというメソッドの名前が示すとおり,ここで作られる床は一切動きません。100kgのボールなどが床にぶつかっても平気です。もちろん,プログラムで明示的に動かすことはできます。

著者プロフィール

木村秀敬(きむらひでたか)

茨城高専,北陸先端大を卒業後,独立系ベンチャーにあこがれてjig.jpに就職。 ActionScript好きですが,根はコテコテのC/C++プログラマです。Flash/ActionScriptに興味のある方は是非Spark Projectへ。