2011-06-14 31 views
0

我是一個相當聰明的人,但是當我看到某種算術時,我可能會成爲一個巨大的白癡。我真的可以在這裏使用一些幫助。Box2D(Cocos2D)隨着時間的推移恆定的力量

我一直在研究大量的事情,因爲我學習iOS遊戲開發,並且在搜索時遇到了一個公式。下面是式:

X(t)= X(0)+ V(0)* T + 0.5(F/M)* T^2

另外指出被求解x和y:

Fx的=(X(t) - X(0) - VX(0)* T)* 2米/噸^ 2

Fy的=(Y(T) - Y( 0)-vy(0)* t)* 2m/t^2

來源:Box2D.org forums

現在對於我的實際問題,這是什麼意思?請記住,在這種情況下,我是一個白癡。如果有人能夠用簡單的術語解釋這些變量以及它們與box2d的關係,那將會很棒。我將如何應用這個公式?這裏是我的代碼(發射彈丸)的例子:

- (void)spawnProjectile:(CGPoint)from direction:(CGPoint)direction inParent:(CCNode*)parentNode 
{ 
    double curTime = CACurrentMediaTime(); 

    double timeTillShotDies = curTime + SHOT_TYPE1_EXIST_TIME; 

    b2Body *shotBody = projectileBodyTracker[nextShot]; 

    b2Vec2 moveToPosition = b2Vec2(from.x/PTM_RATIO, from.y/PTM_RATIO); 
    shotBody->SetTransform(moveToPosition, 0.0); 
    shotBody->SetActive(true); 

    CCSprite *shot = [projectiles objectAtIndex:nextShot]; 
    shot.position = ccp(from.x/PTM_RATIO, from.y/PTM_RATIO); 

    shot.visible = YES; 
    [projectilesTracker replaceObjectAtIndex:nextShot withObject:[NSNumber numberWithDouble:timeTillShotDies]]; 
    CCParticleSystemQuad *particle = [projectileParticleTracker objectAtIndex:nextShot]; 
    [particle resetSystem]; 
    nextShot++; 
    if(nextShot >= projectiles.count) nextShot = 0; 

    // dx2 and dy2 are analog stick values (see below code) 
    b2Vec2 force = b2Vec2(dx2, dy2); 
    shotBody->SetLinearVelocity(force); 

    [AudioController playLaserShot]; 
} 

在代碼這個特殊的一塊,我從球員在模擬是在角度射擊。我也需要用公式從敵人向玩家開火。這是一個自上而下的太空射手。

因此,總結一下,如何根據box2d代碼解決x和y隨時間的恆定作用力?

額外的信息:

dx2 = (float)joypadBG2.position.x - (float)convertedPoint.x; 
dy2 = (float)joypadBG2.position.y - (float)convertedPoint.y; 

所有對象都預裝,並保持這種方式。機構被設置爲不活動,精靈被設置爲不可見。粒子系統停止。再次使用拋射物的情況正好相反。

非常感謝您爲您提供的任何幫助。我希望我沒有忘記任何事情。

回答

1

第一個等式描述了受恆定力作用的物體的運動。 對象從位置x(0)開始,速度v(0)。 x和v都是向量,因此在第2個射手中,x(0)將是(x0,y0)或xy位置,而v(0)會是(vx0,vy0)。

如果沒有重力,那麼在未經推進的拋射物(不帶推進器的拋射物)上F = 0,所以速度將是恆定的。

X(T1)= X(T0)+ VX *(T 1 -T 0) Y(T1)= Y(T0)+ VY *(T 1 -T 0)

T 1 -T 0或DT(增量-t)是自上次更新拋射體位置以來所經過的時間。

如果因爲物體或重力對物體的作用力超過,那麼速度會隨着時間而改變。

VX(T1)= VX(T0)+斧*(T 1 -T 0) VY(T1)= VY(T0)+ AY *(T 1 -T 0)

a是加速度。在遊戲中,你通常不關心質量和力量,只是加速。在物理學中,a = F/m。

編輯1: 在電腦遊戲中,您會非常頻繁地更新對象的位置(通常每秒約60次)。您在上次更新時擁有對象的位置和速度,並且您想要計算新的位置。

您通過假設速度是恆定的更新的位置:

positionVectorAt(newTime) = positionVector(lastTime) + velocityVector*(newTime - lastTime); 

如果物體的速度變化也更新速度:

velocityVectorAt(newTime) = velocityVector(lastTime) + accelerationVector*(newTime - lastTime); 

比方說,我們有一個精靈在

positionVector.x=100; 
positionVector.y=10; 

初始速度是

velocityVector.x = 3; 
velocityVector.y = -10; 

子畫面使用被給出每秒臥式加速度的

thrusterVector.x= 5; 

推進器,並且還受到重力其給出每秒的垂直加速度的

gravityVector.y = -10; 

的更新精靈位置的代碼將爲:

deltaTime = now - lastTime; // Time elapsed since last position update 

// Update the position 
positionVector.x = positionVector.x + velocityVector.x * deltaTime; 
positionVector.y = positionVector.y + velocityVector.y * deltaTime; 

// Update the velocity 
velocityVector.x = velocityVector.x + (thrusterVector.x + gravityVector.x) * deltaTime; 
velocityVector.y = velocityVector.y + (thrusterVector.y + gravityVector.y) * deltaTime; 

// Done! The sprite now has a new position and a new velocity! 
+0

這是非常有用的,但我仍然有點麻煩理解如何將它應用到Cocos2D和Box2D。看到我對Emmanuel的答案的評論。 – 2011-06-14 15:21:48

+0

請參閱編輯1.請注意,我從未使用過Box2D,但這些是如何建模對象運動的原理。 – 2011-06-15 07:52:26

+0

這是完美的謝謝你!正是我需要的。這是一種我能理解的語言:) Box2D只是一種不知道物理學的物理學方法(無論如何,大部分都是這樣)。大多數情況下,當我在模擬世界中移動物體時,我會應用衝動或力量。據我所知,沒有固定的速度持續一定的時間。無論如何,謝謝。 – 2011-06-15 10:29:44

1

這裏是一個快速的解釋:

x(t) = x(0) + v(0)*t + .5 (F/m) * t^2 
Fx = (x(t) - x(0) - vx(0)*t) * 2m/t^2 
Fy = (y(t) - y(0) - vy(0)*t) * 2m/t^2 

這些3個等式是標準運動的:

  • t:時間
  • x(t):在時間位置t
  • v(t):速度在時間t
  • vx(t):速度水平分量t
  • vy(t):在時間速度的垂直分量t
  • m:質量
  • F:力
  • Fx:所述力
  • Fy的水平分量:該力的垂直分量

所以當然,每次看到x(0)vy(0)時,他們e值是在時間t獲得的,即它們是初始值。這些公式爲basic cinematic equations,具有基本的電影變量(位置,速度,力,質量)。

+0

(0)是否僅僅表示它是一個向量?我無法想象這意味着x * 0 ... – 2011-06-14 14:36:35

+0

此刻這是我最好的理解: 'positionVectorAt(time)= positionVector + velocityVector * time + 0.5(Force/mass)* time^2 ; forceOnX =(positionVector.x(time) - positionVector - velocityOfXVector * time)* 2mass/time^2; forceOnY =(positionVector.y(time) - positionVector - velocityOfYVector * time)* 2mass/time^2;' – 2011-06-14 14:43:19

相關問題