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

第4回 いろいろな形の物体を作る

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

その他のパラメータを設定する

仕上げとして密度,反発係数,摩擦係数を設定します。

shapeDef.density = 1;     // 密度 [kg/m^2]
shapeDef.restitution = 0; // 反発係数、通常は0~1
shapeDef.friction = 0.5;  // 摩擦係数、通常は0~1

摩擦係数frictionは新しく出てきたパラメータです。今までの長方形や円ではあまり意味がなさそうなので設定しませんでしたが,今回は三角形という形の特性上,摩擦を設定したほうが面白そうなので使うことにしました。0.5というのがどれぐらいの大きさなのかかを知るには,実際に値を変えて試してみるのがいいと思います。

クリックした点を描画する

最後に,物理エンジンとは直接関係ありませんが,クリックした場所に円を描いている処理について説明します。この処理は,enterFrameHandlerで,物理エンジンを1ステップ進めた後のところに書かれています。

DebugDrawを使っている場合,b2WorldクラスのStepメソッド内で描画処理が行われます。この中では,画面の内容を全て消去して,物理エンジンに登録されている物体の形を描くという処理がされています。そのため,追加の描画処理を書く場合はStepメソッドの直後に書くのが無難だと言えます。

クリックした点を描く処理は以下のとおりです。

var i:int;
for (i = 0; i < pointIndex; ++i) {
	graphics.drawCircle(
		points[i].x * DRAW_SCALE,
		points[i].y * DRAW_SCALE,
		5);
}

今までクリックされた回数だけfor文を回し,drawCircleメソッドを使ってクリックされた点に小さな円を描きます。

多角形を作るには

三角形のプログラムを書き換える

多角形を作るのは簡単です。というのも,三角形の時点でほぼプログラムが完成しているからです。例えば五角形を作りたい場合は,pointsの定義を以下のように書き換えてください。

private var points:Array = [new Point(), new Point(),
	new Point(), new Point(), new Point()];

これだけで,先ほどの三角形を作るFlashが五角形を作るFlashになります。プログラムの中で「三角形」という表現を使わずに「ポリゴン」と言っていたのはこのためです。

おかしな動きをするケース

三角形の時には時計回りという制約がついていましたが,五角形になるとさらに制約が厳しくなります。野球のホームベースのような形の物体を作ると特に問題なく五角形が作られます。

しかし適当に点を打っていると,変な形の物体ができてしまうことがあります。アルファベットのMの字を描くような感じで,真ん中の点を低めに打ってみてください。変な形になってしまいますね。これひとつでも十分変な動きをするのですが,たくさん作ると画面外に飛んでいったりしてしまうことがあります。

また,正常に見えてもおかしい場合があります。同じMの字でも,真ん中が少し高めになるように点を打ってみてください。2つの山がくっついたような五角形が作られたように見えます。ではその上にもう1つ同じ形の物体を作って落としてみてください。どうなりましたか?やはりおかしな動作をしますね。

おかしな動きをする五角形

おかしな動きをする五角形

こういったことが起こるのは,物理エンジンが凸包しか扱えないことが原因です。これについては初回の記事で少し触れました。凸包ではない物体を作りたい場合は,凸包を組み合わせて作るしかありません。

まとめ

円や多角形を作る方法について説明してきました。b2BodyDefを使って物体の中心座標を決めるところは全て共通ですが,形を決める部分はバラバラです。実際には多角形が必要となるシーンはあまりないと思うので,長方形と円を押さえておけばいいと思います。

物体を作る方法については一通り説明し終わったので,次回は物と物をつなぐジョイントについて説明したいと思います。

著者プロフィール

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

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