Box2D 2.0.2触ってみた


今さらですがBox2Dやってみました。というか仕事で物理演算使わなきゃいけなかったので触らざるを得なかったというか。
Box2Dのバージョンは2.0.2です。

ご覧になるには最新のFlashPlayerが必要です。

PV3Dとか他のライブラリとちょっと勝手が違うので最初とまどいましたが。
サンプルのはボックスとサークルを20個ずつNewしてボックスの質量をサークルの質量の100倍にしてます。
ボタンを押したら上下左右ランダムに力を加えてあげてます。

PV3Dとか組み合わせたらおもしろそう。

以下汚いですけどソースです。
(一度全ソース載せましたが長くて表示が遅くなってしまったのでボタン部分とボックス部分、他をちょっと削除します。。)

	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	import Box2D.Common.*;
	import Box2D.Dynamics.*;
	import Box2D.Common.Math.b2Vec2;

	public class Main extends Sprite
	{
		private var m_physScale:uint = 100;
		private var world:b2World;
		private var m_sprite:Sprite;
		private var m_iterations:int = 10;
		private var m_timeStep:Number = 1 / 30;

		public function Main():void
		{
			init();
		}

		private function init():void
		{
			var worldAABB:b2AABB = new b2AABB();
			worldAABB.lowerBound.Set( -100, -100);
			worldAABB.upperBound.Set(100, 100);

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

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

			var wxArr:Array = [0, stage.stageWidth, stage.stageWidth / 2, stage.stageWidth / 2];
			var wyArr:Array = [stage.stageHeight / 2, stage.stageHeight / 2, 0, stage.stageHeight];
			var wwArr:Array = [10, 10, stage.stageWidth, stage.stageWidth];
			var whArr:Array = [stage.stageHeight, stage.stageHeight, 10, 10];

			//Wall
			for (var j:uint = 0; j < 4; j++)
			{
				var floorBodyDef:b2BodyDef = new b2BodyDef();
				floorBodyDef.position.Set(wxArr[j] / m_physScale, wyArr[j] / m_physScale);

				var floorShapeDef:b2PolygonDef = new b2PolygonDef();
				floorShapeDef.SetAsBox(wwArr[j] / 2 / m_physScale, whArr[j]/2 / m_physScale);

				var floorBody:b2Body = world.CreateBody(floorBodyDef);
				floorBody.CreateShape(floorShapeDef);
			}

			//Circle
			for (var i:uint = 0; i < 20; i++)
			{
				var circleBodyDef:b2BodyDef = new b2BodyDef();
				circleBodyDef.position.Set(stage.stageWidth / 2 / m_physScale, 200 / m_physScale);

				var circleShapeDef:b2CircleDef = new b2CircleDef();
				circleShapeDef.radius = Math.random()*0.3+0.05;
				circleShapeDef.density = 1;
				circleShapeDef.friction = 0.5;
				circleShapeDef.restitution = 0.5;

				var circleBody:b2Body = world.CreateBody(circleBodyDef);
				circleBody.CreateShape(circleShapeDef);
				circleBody.SetMassFromShapes();
			}

			//Debug
			m_sprite = new Sprite();
			var debugDraw:b2DebugDraw = new b2DebugDraw();
			debugDraw.m_fillAlpha = 0.3;
			debugDraw.m_drawScale = m_physScale;
			debugDraw.m_lineThickness = 1;
			debugDraw.m_sprite = m_sprite;
			debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit;
			world.SetDebugDraw(debugDraw);
			addChild(m_sprite);

			addEventListener(Event.ENTER_FRAME, update);
		}

		private function update(e:Event):void
		{
			world.Step(m_timeStep, m_iterations);
		}
	}

Tags: , ,

Similar Posts

One Response to “Box2D 2.0.2触ってみた”

Leave a Reply