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

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

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

Box2Dを使った簡単なFlashを作ってみましょう。まずは,床の上に箱を落とすだけのFlashです。ソースコードの説明をする前に,動作を見てみましょう。

サンプルについて

コンパイルと実行

まず,以下のActionScriptファイルをダウンロードしてください。このファイルはどこに置いても構いません。

次に,mxmlcを使ってActionScriptをコンパイルします。このとき,-source-pathオプションを指定して,Box2Dがある場所を指定する必要があります。

mxmlc -source-path=C:\lib\Box2DFlashAS3_2.0.0 DropBox.as

少し長いですね。通常のコンソール画面であれば,上キーを押して以前のコマンド履歴を参照出来るので,二度目以降は入力する必要はありません。何度もコンパイルするときに時間がかかって仕方が無いという方にはfcshがオススメです。興味のある方は調べてみてください。

さて,出来たDropBox.swfは以下のようなものになります。

最初は何も表示されていませんが,画面内をクリックしてみてください。少し傾いた箱が落ちてきて,バウンドした後に静止します。もう一度クリックすると,最初から実行されます。

物理エンジン内のレイアウト

このサンプルが,実際にどのようなスケールの中で展開されているのか説明します。幅4m,厚さ20cmの床の上に,幅60cm,高さ40cmの箱を落とします。箱は,床から2mのところから落とします。画面全体のサイズは幅5m,高さ3.75mです。図で説明すると以下のとおりです。

物体の配置図

物体の配置図

こうしたスケールにしている理由の1つは,Box2Dで扱いやすいスケールが0.1m(10cm)から10mであるということです。マニュアルの中では,スープの缶からバスぐらいまでと書かれています。Box2Dはこの範囲内で動くようにチューニングされており,範囲を超えてしまうと,シミュレーションの精度が落ちてしまうようです。詳しくはマニュアル中の3.3. Unitsを参照してください。

もう1つの理由は,イメージのしやすさです。実はBox2Dの公式マニュアルに今回の説明とほぼ同じ説明があるのですが,その中に出てくる箱のサイズは1m四方と少し大きめです。そこで,それよりも少し小さくして,幅60cm,高さ40cmとしました。

イベントハンドラの登録

それではプログラムの説明に移ります。まずはコンストラクタの説明です。ここでは2つのイベントハンドラを登録しています。

stage.addEventListener(MouseEvent.CLICK, clickHandler);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);

1つは,クリックによって物理エンジンのセットアップを行うためのイベントハンドラclickHandlerです。このイベントハンドラが今回の内容の大半を占めます。

もう1つは,画面が更新されるときに物理エンジン内の時間を進めるためのイベントハンドラenterFrameHandlerです。

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

clickHandlerでは,物理エンジンのセットアップ,床と箱の設置,描画設定と,一通りのことを行います。まずは物理エンジンのセットアップから見ていきましょう。

外枠を定義する

最初にすることは,物理エンジンが影響する範囲を決めることです。

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100, -100);
worldAABB.upperBound.Set(100, 100);

範囲はb2AABBクラスで定義されます。このAABB(Axis-aligned bounding box)とは物理エンジンでよく出てくるのですが,斜めになっていない,軸に沿った長方形だと考えてください。長方形の左上がlowerBound,右下がupperBoundとなります。

これを図で表すと以下のようになります。

物理エンジンの影響する範囲

物理エンジンの影響する範囲

ここでひとつ大事なポイント。指定している数値は決してピクセル単位ではありません。マニュアルには,この数値はメートルとして考えると書かれています。これに従うと,AABBは縦横200mとなります。これだけのサイズがあれば,物理エンジンの影響範囲は十分にカバーできます。

その他の単位については,重さはキログラム,時間は秒とするといいと書かれているので,これらも指示通りにします。

著者プロフィール

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

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

コメント

コメントの記入