package{ import flash.display.Sprite; import flash.display.MovieClip; import flash.events.Event; // Classes used in this example import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class HelloBox2D extends Sprite{ public var m_world:b2World; public var m_iterations:int = 10; public var m_timeStep:Number = 1/30; public function HelloBox2D(){ // STAGE PROPERTIES //stage.scaleMode = StageScaleMode.NO_SCALE; //stage.align = StageAlign.TOP_LEFT; //stage.quality = "low"; // Add event for main loop addEventListener(Event.ENTER_FRAME, Update, false, 0, true); // Creat world AABB var worldAABB:b2AABB = new b2AABB(); //worldAABB.minVertex.Set(-1000.0, -1000.0); //worldAABB.maxVertex.Set(1000.0, 1000.0); // try to make this work with stage variables worldAABB.minVertex.Set (0, 0); worldAABB.maxVertex.Set (stage.stageWidth, stage.stageHeight); // Define the gravity vector var gravity:b2Vec2 = new b2Vec2(0.0, 300.0); // Allow bodies to sleep var doSleep:Boolean = true; // Construct a world object m_world = new b2World(worldAABB, gravity, doSleep); // Vars used to create bodies var bodyDef:b2BodyDef; var boxDef:b2BoxDef; var circleDef:b2CircleDef; // Add ground body bodyDef = new b2BodyDef(); boxDef = new b2BoxDef(); bodyDef.userData = PhysGround; boxDef.extents.Set(bodyDef.userData.width / 2, bodyDef.userData.height / 2); boxDef.friction = 0.3; bodyDef.position.Set(bodyDef.userData.x, bodyDef.userData.y); bodyDef.AddShape(boxDef); addChild(bodyDef.userData); m_world.CreateBody(bodyDef); /// LETS ADD A SECOND GROUND BODY FOR TESTING PURPOSES // Add ground body bodyDef = new b2BodyDef(); boxDef = new b2BoxDef(); bodyDef.userData = PhysGround2; boxDef.extents.Set(bodyDef.userData.width / 2, bodyDef.userData.height / 2); boxDef.friction = 0.3; bodyDef.position.Set(bodyDef.userData.x, bodyDef.userData.y); bodyDef.AddShape(boxDef); addChild(bodyDef.userData); m_world.CreateBody(bodyDef); // Add some objects for (var i:int = 1; i < 20; i++){ bodyDef = new b2BodyDef(); // Box // Circle circleDef = new b2CircleDef(); circleDef.radius = Math.random() * 15; circleDef.density = 1.0; circleDef.friction = 0.5; circleDef.restitution = 0.2 bodyDef.AddShape(circleDef); bodyDef.userData = new PhysCircle(); bodyDef.userData.width = circleDef.radius * 2; bodyDef.userData.height = circleDef.radius * 2; bodyDef.position.x = Math.random() * stage.stageWidth; bodyDef.position.y = Math.random() * stage.stageHeight * 2/3; m_world.CreateBody(bodyDef); addChild(bodyDef.userData); } } public function Update(e:Event):void{ m_world.Step(m_timeStep, m_iterations); // Go through body list and update sprite positions/rotations for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){ if (bb.m_userData is Sprite){ bb.m_userData.x = bb.m_position.x; bb.m_userData.y = bb.m_position.y; bb.m_userData.rotation = bb.m_rotation * (180/Math.PI); } } } } }