2011-04-24 80 views
0

這裏是我在彈丸類更新方法上的代碼。 每個fram previousXposition被添加到最後的結果,而不是替換最後的結果。 問題的原因和解決方法是什麼?xna更新方法 - 爲什麼=符號的行爲就像+ =

public void Update(GameTime gameTime) 
{ 

    if (Position.X != previousXPosition) 
    { 
     flightTime += (float)gameTime.ElapsedGameTime.TotalSeconds; 
     Position.X += previousXPosition; 
     Position.Y -= previousYPosition; 

     previousXPosition = (projectileVelocity.X * flightTime) + 0.5f * (wind * (float)Math.Pow(flightTime, 2)); 
     previousYPosition = (projectileVelocity.X * flightTime) + 0.5f * (gravity * (float)Math.Pow(flightTime, 2)); 
    } 

回答

0

以這種方式累積'flightTime'不適用於速度變化。它假定整個飛行速度的每一幀都是這個特定的幀,事實並非如此。

這裏是我建議編碼彈丸飛行的一種方法。將「速度」建立爲矢量2,其矢量表示拋射體正在傳播的方向,其大小表示其正在傳播的速度,單位爲每秒。

float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; // time since last frame only 

    // the velocity vector will have a magnitude equiv to units traveled per second. 
    float speed = velocity.Length(); 
    Vector2 windDrag = (Vector2.Negate(velocity)/speed) * (speed * speed * dragCOef); 
    Vector2 gravity = Vector2.UnitY * gravCOef;// gravity can be a constant per unit time. 

    Vector2 velocityChange = windDrag + gravity; 
    velocity += velocityChange * elapsed;// adds just the change of velocity this frame to the overall velocity 
    Position += velocity * elapsed;// 'velocity' is distance traveled per second. 'velocity * elapsed' is just distance traveled per frame 

Ø

+0

感謝您的答案,但我想知道爲什麼等號(=)是在演戲就像+ =登錄:previousXPosition =其代表的增量。我應該每次都取消它嗎? – gooteis 2011-04-25 08:21:01

+0

previousXPosition不是三角洲。這是因爲'飛行時間'不是德爾塔時間,而是累計時間。像這樣積累時間通常不是一個好方法。 – 2011-04-25 13:13:34

+0

您計算的表達式不容易遵循。考慮簡化它們或將它們分離爲幾個子表達式,以幫助使它更易於閱讀和維護。 – 2011-04-26 15:48:27

相關問題