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 نظرات:
ارسال یک نظر