рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп рдкрд╛рдардХ!
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдПрдХ
рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдмреЙрдХреНрд╕ 2 рдбреА рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдЗрдЯ рдкрд░ рдЗрдВрдЬрди рд╕рдВрд╕реНрдХрд░рдг 2.1a рдерд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХрд╛рдо рд╕реЗ рдЕрд▓рдЧ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрдВрдЬрди рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЕрд▓реНрдк рд╡рд┐рджреЗрд╢реА рдкреНрд░рд▓реЗрдЦрди рдиреЗ рдореБрдЭреЗ рдмрд╣реБрдд рдХреБрдЫ рд╕рдордЭрд╛ рджрд┐рдпрд╛ред рдореИрдВ рдЕрдкрдиреЗ рд╢реЛрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдкреНрд░рд┐рдп рдкрд╛рдардХред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 2.0 рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
(рдореИрдВ FlashDevelop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рджреЗрдЦрддрд╛ рд╣реВрдВ:
package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } public function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); } } }
рдЕрдЧрд▓рд╛, рд╣рдо рдЗрдВрдЬрди
рдХреЗ 2.1a рд╕рдВрд╕реНрдХрд░рдг рдХреЛ
рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
рд╣рдо рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.b2PolygonShape; import Box2D.Collision.Shapes.b2CircleShape; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.utils.getTimer;
рд╡реЗ рдЪрд░ рдмрдирд╛рдПрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public var PIXELS_TO_METRE:Number = new Number(30);
ADDED_TO_STAGE рд╣реИрдВрдбрд▓рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреА рджреБрдирд┐рдпрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ:
world = new b2World(new b2Vec2(0, 10), true);
рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ b2Vec2 рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд▓реЗрддрд╛ рд╣реИ рд╡рд╣ рд╣рдорд╛рд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ 10 рдЕрдВрдХ рд╕реЗ y рдЕрдХреНрд╖ рдиреАрдЪреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдиреАрдВрдж рдХреА рдЕрдиреБрдорддрд┐ / рдирд┐рд╖реЗрдз рд╣реИред
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдЖрдпрдд рдмрдирд╛рддрд╛ рд╣реИ:
public function addBox(x:Number, y:Number, width:Number, height:Number, dyn:int = 0):b2Body { var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((x + width / 2) / PIXELS_TO_METRE, (y + height / 2) / PIXELS_TO_METRE); if (dyn == 1) bodyDef.type = b2Body.b2_dynamicBody; var content:Sprite = new Sprite(); content.graphics.beginFill(0x000000); content.graphics.drawRect(0 - width / 2, 0 - height / 2, width, height); bodyDef.userData = content; addChild(bodyDef.userData); var boxShape:b2PolygonShape = new b2PolygonShape(); boxShape.SetAsBox(width / 2 / PIXELS_TO_METRE, height / 2 / PIXELS_TO_METRE); var fixtureDef:b2FixtureDef = new b2FixtureDef(); fixtureDef.shape = boxShape; fixtureDef.density = dyn; var body:b2Body = world.CreateBody(bodyDef); body.CreateFixture(fixtureDef); return(body); }
рдмреЙрдбреАрдлреИрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдорд╛рд░реЗ рдЖрдпрдд рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ: рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рд░реЛрдЯреЗрд╢рди рдФрд░ рд╕рд╛рдордЧреНрд░реАред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╕рдордиреНрд╡рдп рдмрд┐рдВрджреБ рд╣рдорд╛рд░реА рдЖрдпрдд рдХрд╛ рдХреЗрдВрджреНрд░ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдмрд┐рдВрджреБ рдХреА рдЧрдгрдирд╛ рдХреА, рдЬрд┐рд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓
(рдЬреАрд╡рд┐рдд) рджреЛрдиреЛрдВ рдЖрдпрддрд╛рдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рд░ рд╣реЛрдВрдЧреЗред рд╣рдо рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░
(dyn) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдореИрдВ рдХреЗрдВрджреНрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЖрдпрдд рдХреЛ, рдЗрд╕рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХ рдШрдЯрдХ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
рдкреНрд░рдХрд╛рд░ b2PolygonShape рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА SetAsBox рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рднреМрддрд┐рдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдпрдд рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдореАрдЯрд░ рднреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмреАрдЪ рд╕реЗ рдЧрд┐рдирддреА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
рдлрд╝рд┐рдХреНрдЪрд░рдбрд┐рдл рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдорд╛рд░реА рдЖрдпрдд рдХрд╛ рднреМрддрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ: рдЧрддрд┐рд╢реАрд▓рддрд╛, рдШрдирддреНрд╡, рд▓реЛрдЪ рдФрд░ рднреМрддрд┐рдХ рдореЙрдбрд▓ред рдореИрдВрдиреЗ рдШрдирддреНрд╡ рдФрд░ рд▓реЛрдЪ рдЬреИрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреА рджреБрдирд┐рдпрд╛ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рдореИрдВрдиреЗ рдЧреЗрдВрдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рдпрд╛, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдпрдХ:
public function addBall(x:Number, y:Number, radius:Number):void { var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set((x + radius) / PIXELS_TO_METRE, (y + radius) / PIXELS_TO_METRE); bodyDef.type = b2Body.b2_dynamicBody; var content:Sprite = new Sprite(); content.graphics.beginFill(0x000000); content.graphics.drawCircle(0, 0, radius); bodyDef.userData = content; addChild(bodyDef.userData); var circShape:b2CircleShape = new b2CircleShape(radius / PIXELS_TO_METRE); var fixtureDef:b2FixtureDef = new b2FixtureDef(); fixtureDef.shape = circShape; fixtureDef.density = 1; ball = world.CreateBody(bodyDef); ball.CreateFixture(fixtureDef); }
рдПрдХ рдЧреЗрдВрдж рдмрдирд╛рдирд╛ рдПрдХ рдЖрдпрдд рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдПрдХ рддреНрд░рд┐рднреБрдЬ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдХреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реАрдврд╝реА рд╣реЛрдЧреА:
public function addTriangle(x:Number, y:Number, size:Number):void { var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set(x / PIXELS_TO_METRE, y / PIXELS_TO_METRE); var content:Sprite = new Sprite(); content.graphics.beginFill(0x000000); content.graphics.moveTo(size, 0); content.graphics.lineTo(0, size); content.graphics.lineTo(size, size); bodyDef.userData = content; addChild(bodyDef.userData); var polyDef:b2PolygonShape = new b2PolygonShape(); polyDef.SetAsArray([ new b2Vec2(size / PIXELS_TO_METRE, size / PIXELS_TO_METRE), new b2Vec2(0, size / PIXELS_TO_METRE), new b2Vec2(size / PIXELS_TO_METRE, 0) ]); var fixtureDef:b2FixtureDef = new b2FixtureDef(); fixtureDef.shape = polyDef; fixtureDef.density = 0; var body:b2Body = world.CreateBody(bodyDef); body.CreateFixture(fixtureDef); }
рднреМрддрд┐рдХ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИред рдпрд╣рд╛рдБ рднреМрддрд┐рдХ рдореЙрдбрд▓ b2PolygonShape рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдЪреВрдВрдХрд┐ рдХреЛрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИ
(рдЬреИрд╕реЗ рдЕрдбрдмреЙрдХреНрд╕), рд╣рдо рд╕реНрд╡рдпрдВ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реИрдХреНрдЯрд░ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред рдЧрд┐рдирддреА рд╕рд░рдгреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рд╕реЗ рдкрд╣рд▓реА рддрдХ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рдХреНрд░реЗрдЯрдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдирд╛рдордХ рдПрдХ рдлрдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
public function creteObjects():void { addBall(10, 400, 50); addBox(0, 580, 450, 20, 0); addBox(250, 540, 200, 40, 0); addTriangle(210, 540, 40); addBox(610, 540, 190, 60); addBox(-10, 0, 10, 600); addBox(800, 0, 10, 600); var m1:b2Body = addBox(430, 540, 20, 5, 0); var m2:b2Body = addBox(451, 540, 20, 5, 1); var m3:b2Body = addBox(472, 540, 20, 5, 1); var m4:b2Body = addBox(493, 540, 20, 5, 1); var m5:b2Body = addBox(514, 540, 20, 5, 1); var m6:b2Body = addBox(535, 540, 20, 5, 1); var m7:b2Body = addBox(556, 540, 20, 5, 1); var m8:b2Body = addBox(577, 540, 20, 5, 1); var m9:b2Body = addBox(598, 540, 20, 5, 0); }
рдЕрдВрддрд┐рдо рддрддреНрд╡ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреБрд▓ рд╣реИрдВред
рдЖрдЧреЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреБрд▓ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╣рдо creteObjects рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef(); jointDef.enableLimit = true; jointDef.lowerAngle = 0; jointDef.upperAngle = 0.1; jointDef.Initialize(m1, m2, m1.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m2, m3, m2.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m3, m4, m3.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m4, m5, m4.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m5, m6, m5.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m6, m7, m6.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m7, m8, m7.GetWorldCenter()); world.CreateJoint(jointDef); jointDef.Initialize(m8, m9, m8.GetWorldCenter()); world.CreateJoint(jointDef);
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реАрдорд╛рдПрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╣рд┐рд▓рд╛ рди рд╣реЛред
рдЕрдЧрд▓рд╛, рд╣рдо рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рджреБрдирд┐рдпрд╛ рдХреА рд╕рднреА рд╡рд╕реНрддреБрдПрдВ рддреИрдпрд╛рд░ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЖрд╡реЗрджрди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдХреНрдпреЛрдВ? рд╣рдордиреЗ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
Init рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо ENTER_FRAME рдЗрд╡реЗрдВрдЯ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ:
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ onEnterFrame рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб:
public function onEnterFrame(e:Event = null):void { world.Step(1 / 30, 10, 10); for (var bb:b2Body = world.GetBodyList(); bb; bb = bb.GetNext()){ if (bb.GetUserData() is Sprite) { var sprite:Sprite = bb.GetUserData() as Sprite; sprite.x = bb.GetPosition().x * PIXELS_TO_METRE; sprite.y = bb.GetPosition().y * PIXELS_TO_METRE; sprite.rotation = bb.GetAngle() * (180 / Math.PI); } } }
рд╕реНрдЯреЗрдк рдлрдВрдХреНрд╢рди рд╣рдорд╛рд░реА рджреБрдирд┐рдпрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рд▓рдЧрддрд╛ рд╣реИред рд╕реЗрдХрдВрдб рдореЗрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд░реЛрдЯреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдм рдЗрд╕реЗ рдареАрдХ рдХрд░реЛред
рдПрдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВ:
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
OnKeyDown рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдБ:
public function onKeyDown(e:KeyboardEvent):void { if (e.keyCode == 39 && getTimer() - p > 200) { ball.ApplyImpulse(new b2Vec2(10, 0), ball.GetPosition()); p = getTimer(); }else if (e.keyCode == 37 && getTimer() - p > 200) { ball.ApplyImpulse(new b2Vec2( -10, 0), ball.GetPosition()); p = getTimer(); } }
ApplyImpulse рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдмрд▓ рд╡реЗрдХреНрдЯрд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдПрдХ рдзрдХреНрдХрд╛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдХреАрд╕реНрдЯреНрд░реЛрдХреЗ рдХреЛ рднреА рдпрд╛рдж рдХрд┐рдпрд╛ рдФрд░ рдЕрдЧрд▓рд╛ 200 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ
рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд░реЛрддреЛрдВ рдХреЛ
рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб
рдХрд░реЗрдВ ред
рд╣рдордиреЗ рдмреЙрдХреНрд╕ 2 рдбреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЪрд░реНрдЪрд╛ рдХреА, рджреЛрдиреЛрдВ рдорд╛рдирдХ рдФрд░ рд╣рдорд╛рд░реЗред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реНрдирд╛рдпреБрдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреБрд▓ рдмрдирд╛рдпрд╛ рдФрд░ рдЪрд░рд┐рддреНрд░ рдХреЛ рдЪрд▓рдирд╛ рд╕рд┐рдЦрд╛рдпрд╛ред рдЧреБрдб рд▓рдХ, рдкреНрд░рд┐рдп рдкрд╛рдардХ!