Box2d يك موتور سورس باز شبیه ساز فیزیک در فلاش است که دارای یک نسخه ++C هم مي باشد.
یکی از مفاهیم کلیدی در این موتور مفهموم بادی یا جسم است که در حقیقت یک موجودیت واحد بدون انعطاف است و به سه صورت زیر دیده می شود.
1- جسم غیر ایستا : این نوع جسم تحت تاثیر نیروهای محیطی قرار می گیرد و به برخوردها واکنش نشان می دهد.
2- جسم ایستا : دقیقا بر عکس جسم غیر ایستا است. تحت اثر هیچ نیرویی قرار نمی گیرد و کاملا بی حرکت است.
3 - جسم کینماتیک : در حقیفت یک نوع ترکیبی است از یک طرف مانند جسم ایستا به نیروهای محیطی واکنش نشان نمی دهد و از طرفی دیگر مانند جسم غیر ایستا متحرک است. یعنی با سرعتی مشخص در یک مسیر خطی حرکت می کند .
مثال زیر مطلب را بهتر شرح می دهد:
یکی از مفاهیم کلیدی در این موتور مفهموم بادی یا جسم است که در حقیقت یک موجودیت واحد بدون انعطاف است و به سه صورت زیر دیده می شود.
1- جسم غیر ایستا : این نوع جسم تحت تاثیر نیروهای محیطی قرار می گیرد و به برخوردها واکنش نشان می دهد.
2- جسم ایستا : دقیقا بر عکس جسم غیر ایستا است. تحت اثر هیچ نیرویی قرار نمی گیرد و کاملا بی حرکت است.
3 - جسم کینماتیک : در حقیفت یک نوع ترکیبی است از یک طرف مانند جسم ایستا به نیروهای محیطی واکنش نشان نمی دهد و از طرفی دیگر مانند جسم غیر ایستا متحرک است. یعنی با سرعتی مشخص در یک مسیر خطی حرکت می کند .
مثال زیر مطلب را بهتر شرح می دهد:
package { import flash.display.Sprite; import flash.events.Event; import flash.utils.Timer; import flash.events.TimerEvent; import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; public class Main extends Sprite { private var world:b2World=new b2World(new b2Vec2(0,5),true); private var worldScale:Number=30; private var timer:Timer=new Timer(1000); public function Main() { debugDraw(); for (var i:int=0; i<10; i++) { // building 10 kinematic spheres // five on the left side of the stage moving right // five on the right side of the stage moving left kinematicSphere(640*(i%2),50+40*i,10,(1-2*(i%2))*(Math.random()*10+5)); } addEventListener(Event.ENTER_FRAME,updateWorld); // I will make a dynamic sphere fall from the top of the stage // at every second timer.start(); timer.addEventListener(TimerEvent.TIMER,addSphere); } private function addSphere(e:TimerEvent):void { dynamicSphere(320,-10,10); } private function dynamicSphere(pX:int,pY:int,r:Number):void { var bodyDef:b2BodyDef=new b2BodyDef(); bodyDef.position.Set(pX/worldScale,pY/worldScale); bodyDef.type=b2Body.b2_dynamicBody; var circleShape:b2CircleShape=new b2CircleShape(r/worldScale); var fixtureDef:b2FixtureDef=new b2FixtureDef(); fixtureDef.shape=circleShape; var theDynamic:b2Body=world.CreateBody(bodyDef); theDynamic.CreateFixture(fixtureDef); } private function kinematicSphere(pX:int,pY:int,r:Number,hV):void { var bodyDef:b2BodyDef=new b2BodyDef(); bodyDef.position.Set(pX/worldScale,pY/worldScale); // ************************** HERE IS THE MAGIC LINE ************************** \\ bodyDef.type=b2Body.b2_kinematicBody; var circleShape:b2CircleShape=new b2CircleShape(r/worldScale); var fixtureDef:b2FixtureDef=new b2FixtureDef(); fixtureDef.shape=circleShape; var theKinematic:b2Body=world.CreateBody(bodyDef); theKinematic.CreateFixture(fixtureDef); // look, I can set a linear velocity theKinematic.SetLinearVelocity(new b2Vec2(hV,0)); } private function debugDraw():void { var debugDraw:b2DebugDraw=new b2DebugDraw(); var debugSprite:Sprite=new Sprite(); addChild(debugSprite); debugDraw.SetSprite(debugSprite); debugDraw.SetDrawScale(worldScale); debugDraw.SetFlags(b2DebugDraw.e_shapeBit); debugDraw.SetFillAlpha(0.5); world.SetDebugDraw(debugDraw); } private function updateWorld(e:Event):void { world.Step(1/30,10,10); world.ClearForces(); for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) { // changing kinematic sphere linear velocity if it touches stage edges if (b.GetType()==b2Body.b2_kinematicBody) { var xSpeed:Number=b.GetLinearVelocity().x; var xPos:Number=b.GetWorldCenter().x*worldScale; if ((xPos<10&&xSpeed<0) || (xPos>630&&xSpeed>0)) { xSpeed*=-1; b.SetLinearVelocity(new b2Vec2(xSpeed,0)); } } else { if (b.GetWorldCenter().y*worldScale>480) { world.DestroyBody(b); } } } world.DrawDebugData(); } } }
0 نظرات:
ارسال یک نظر