import Box2D.Dynamics.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*;
public static const ITERATIONS:int = 20; public static const TIMESTEP:Number = 1.0 / 30.0;
public var world:b2World; public var sprite:Sprite; // " " public var boundsWorld:b2Body; public var hero:b2Body; public var rotator:Number;
public function InitializePhysicsWorld():void { var worldAABB:b2AABB = new b2AABB(); // , , . worldAABB.lowerBound.Set(-300, -300.0); worldAABB.upperBound.Set(300.0, 300.0); world = new b2World(worldAABB, new b2Vec2(0, 0), false); // , worldAABB - ; new bVec2(0, 0) - , ; false - . var dbgDraw:b2DebugDraw = new b2DebugDraw(); // , , , . dbgDraw.m_sprite= sprite; dbgDraw.m_drawScale= 30; dbgDraw.m_alpha = 1; dbgDraw.m_fillAlpha = 0.5; dbgDraw.m_lineThickness = 1; dbgDraw.AppendFlags(b2DebugDraw.e_shapeBit); // world.SetDebugDraw(dbgDraw); }
public function Main():void { sprite = new Sprite(); addChild(sprite); sprite.x = sprite.y = 250; rotator = 0; InitializePhysicsWorld(); }
public function CreateBoundsWorld():b2Body { var body:b2Body; // var bodyDef:b2BodyDef; // var polygon:b2PolygonDef; // bodyDef = new b2BodyDef(); polygon = new b2PolygonDef(); bodyDef.position.Set(0, 0); // x:0, y:0 polygon.density = 0; // 0, .. density , . polygon.friction = 1.0; polygon.restitution = 0.2; body = world.CreateBody(bodyDef); // // polygon.SetAsOrientedBox(300/2/30, 1/2/30, new b2Vec2(0, -300/2/30), 0); body.CreateShape(polygon); polygon.SetAsOrientedBox(300/2/30, 1/2/30, new b2Vec2(0, 300/2/30), 0); body.CreateShape(polygon); polygon.SetAsOrientedBox(1/2/30, 300/2/30, new b2Vec2(300/2/30, 0), 0); body.CreateShape(polygon); polygon.SetAsOrientedBox(1/2/30, 300/2/30, new b2Vec2(-300/2/30, 0), 0); body.CreateShape(polygon); body.SetMassFromShapes(); // , . return body; // . }
boundsWorld = CreateBoundsWorld();
public function enterFrameListener(event:Event):void { world.Step(timestep, ITERATIONS); // Box2D ( ). : Box2D Step(float timeStep,int iterations), : , . }
this.addEventListener(Event.ENTER_FRAME, enterFrameListener);
public function CreateHero(x:Number, y:Number):void { var bodyDef:b2BodyDef; var circleDef:b2CircleDef; var x:Number; var y:Number; var r:Number; /* HERO */ x = x / 30; // y = y / 30; // r = 8 / 30; // bodyDef = new b2BodyDef(); bodyDef.position.Set(x, y); circleDef = new b2CircleDef(); circleDef.radius = r; circleDef.density = 1; circleDef.friction = 1; circleDef.restitution = 0.2; hero = world.CreateBody(bodyDef); hero.SetUserData("hero"); // " " hero.CreateShape(circleDef); hero.SetMassFromShapes(); }
CreateHero(0, 0);
public var keyPressedRight:Boolean; public var keyPressedLeft:Boolean;
parent.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener); parent.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
public function keyDownListener(event:KeyboardEvent):void { switch(event.keyCode) { case 37: keyPressedRight = true; break; case 39: keyPressedLeft = true; break; } } public function keyUpListener(event:KeyboardEvent):void { switch(event.keyCode) { case 37: keyPressedRight=false; break; case 39: keyPressedLeft = false; break; } }
if (keyPressedRight) rotator -= 4; else if(keyPressedLeft) rotator += 4;
sprite.rotation = rotator;
var angle:Number = (270 + rotator_fix) / 180 * Math.PI; var pseudo_gravity:b2Vec2 = b2Vec2.Make(Math.cos(angle), -Math.sin(angle));
for (var body:b2Body = world.GetBodyList(); body; body = body.GetNext()) // . { if (body.GetUserData() == "hero") // userdata - hero, . { pseudo_gravity.x *= 9.8 * body.GetMass(); pseudo_gravity.y *= 9.8 * body.GetMass(); body.ApplyForce(pseudo_gravity, body.GetWorldCenter()); // } }
public function CreateStaticRect(x:Number, y:Number, w:Number, h:Number):void { var total_x:Number = ((x + w / 2) - 150) / 30; var total_y:Number = ((y + h / 2) - 150) / 30; var total_w:Number = w / 30; var total_h:Number = h / 30; var body:b2Body; var bodyDef:b2BodyDef; var polygon:b2PolygonDef; bodyDef = new b2BodyDef(); polygon = new b2PolygonDef(); bodyDef.position.Set(0, 0); bodyDef.position.Set(total_x, total_y); polygon.SetAsBox(total_w / 2, total_h / 2); polygon.density = 0.0; polygon.friction = 0.5; polygon.restitution = 0.2; body = world.CreateBody(bodyDef); body.CreateShape(polygon); body.SetMassFromShapes(); body.SetUserData("box"); }
CreateStaticRect(0, 150, 150, 10);
Source: https://habr.com/ru/post/121193/