ブログ アーカイブ

2008年6月5日木曜日

Box2Dを試す

Flash Developを使って2D物理ライブラリBox2Dを試してみます。


まずはBox2DFlashAS3のプロジェクトページからライブラリをダウンロードします。
筆者はバージョン2.0.0を取得しました。
$ wget http://downloads.sourceforge.net/box2dflash/Box2DFlashAS3_2.0.0.zip
$ unzip Box2DFlashAS3_2.0.0.zip

ライブラリとして使うのでSWCにしてしまいます。FlashDevelopでのSWC作成方法がわからないのでSDKのコンパイラを使いました。
※HelloWorld.asはコンパイルエラーになってしまうので除外しています。
$ cd Box2DFlashAS3_2.0.0
$ find . -name '*.as' ! -name 'HelloWorld.as' | awk -F '/' '/./{buf="";for(i=2;i<=NF;++i)buf=buf "." $i;print buf}' | sed -e 's/^\.//g' -e 's/\.as$/ /g' | tr -d '\n' | xargs $FLEX_HOME/bin/compc.exe --source-path . -output Box2D.swc -include-classes


FlashDevelopで適当にFlex3プロジェクトを作成します。

プロジェクトフォルダにlibフォルダを作成し、そこに先ほど作成したBox2D.swcをコピーします。
そしてFlash Develop上でBox2D.swcを右クリックしてAdd To Libraryを選択します。

これでBox2Dライブラリが参照され、コードヒントが使えるようになります。




次にBox2DユーザーマニュアルのHello Box2Dを参考にプログラムを作成します。
サンプルは1つのMXMLと1つのASで作成しました。

Main.mxml
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" layout="vertical">
<local:HelloBox2D out="{hoge}" />
<mx:TextArea id="hoge" width="800" height="600" />
</mx:Application>


HelloBox2D.as
package
{
import Box2D.Collision.b2AABB;
import Box2D.Collision.b2Bound;
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2World;
import flash.events.Event;
import mx.containers.Canvas;
import mx.controls.Alert;
import mx.controls.TextArea;
import mx.core.UIComponent;
import mx.events.FlexEvent;

public class HelloBox2D extends UIComponent
{
public var out:TextArea;

public function HelloBox2D()
{
addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
}

private function onCreationComplete(event:Event):void
{
var worldAAABB:b2AABB = new b2AABB();
worldAAABB.lowerBound.Set(-100.0, -100.0);
worldAAABB.upperBound.Set(100.0, 100.0);

var gravity:b2Vec2 = new b2Vec2(0.0, -10.0);
var doSleep:Boolean = true;
var world:b2World = new b2World(worldAAABB, gravity, doSleep);

var groudBodyDef:b2BodyDef = new b2BodyDef();
groudBodyDef.position.Set(0, -10);

var groudBody:b2Body = world.CreateStaticBody(groudBodyDef);

var groudShapeDef:b2PolygonDef = new b2PolygonDef();
groudShapeDef.SetAsBox(50, 10);

groudBody.CreateShape(groudShapeDef);

var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set(0, 4);
var body:b2Body = world.CreateDynamicBody(bodyDef);

var shapeDef:b2PolygonDef = new b2PolygonDef();
shapeDef.SetAsBox(1, 1);
shapeDef.density = 1;
shapeDef.friction = 1;
body.CreateShape(shapeDef);
body.SetMassFromShapes();

var timeStep:Number = 1 / 60;

var iterations:Number = 10;

for (var i:Number = 0; i < 60; ++i)
{
world.Step(timeStep, iterations);
var position:b2Vec2 = body.GetPosition();
var angle:Number = body.GetAngle();
out.text += position.x + "," + position.y + "," + angle + "\n";
}
}
}
}

あとはこれをコンパイルなのですが、Flash DevelopではBox2Dのライブラリを参照できていないようでコンパイルエラーになってしまいます。
仕方ないのでSDKでコンパイルします。
$ $FLEX_HOME/bin/fcsh.exe
(fcsh) mxmlc src/Main.mxml -compiler.include-libraries lib/Box2D.swc

これでコンパイルできました。
Main.swfを実行してみます。

position.yの値が徐々に減っている様子がわかりますね。
Box2Dは2D物理計算だけ行うようですね。図形の描画は自分で実装するようです。
その辺はまた次回にやります。

0 件のコメント: