2012-11-17 55 views
1

隨着這些等式的跳轉大小隨着每秒更新量的下降而下降。用Delta值乘以重力和跳躍力下降的數量,以及每次迭代所增加的時間(增量值是自上次更新後傳遞的毫秒數),人們會認爲它可以正常工作。重力方程 - 速度方程|爲什麼它只適用於某些FPS?

//d is delta 
... 
if(isFalling||isJumping){ 

     elapsedTime +=d; 
//the elapsed time is the total amount of time passed since one started jumping, 
//so that's logical to add the amount of time since last update. 

     long tesquared = (long) Math.pow(elapsedTime, 2); 
//amount of time elapsed squared. 

     jumpSpeed+=-0.0000005*elapsedTime*d; 
//this is the amount that jumpspeed is taken down by every time. 

     if(jumpSpeed > 0){ 
      isJumping = true; 
     } else { 
      isJumping = false; 
     } 
     double fGravity = 0.0000001*tesquared*d; 

// this is the equation for gravity, the amount that the player goes down 

     yRend += jumpSpeed - fGravity; 
    //the amount it goes up, minus the amount it goes down. 
     xRend -= strafeSpeed; 
     oldyRend = yRend; 

    } 

要開始跳轉,可以將jumpSpeed加上任意數量。

問題是,當每秒更新的數量減少時,跳躍的持續時間和大小會減少。我相當肯定這裏的delta值是正確的,這意味着問題必須在方程本身中。

我想fGravity超過jumpSpeed當增量更大時更快。

所以我的問題。如果問題真的是在方程本身,什麼是玩家負以外

jumpSpeed+=-0.0000005*elapsedTime*d;

double fGravity = 0.0000001*tesquared*d;向下的重力的向上力模型的正確方法是什麼?

如果問題出在delta值未正確應用,那麼應用它的正確方法是什麼?

+2

我不明白你是怎麼做到的。垂直速度通常是初始垂直速度減重力* timeElapsed。那麼jumpSpeed如何在每個幀減少時間Elasped * delta? 你的方程式對我來說似乎非常錯誤。 –

+0

是的,我本質上是問什麼是正確的方程式。 'fGravity'是否適用於你所描述的方程(把它放在重力的位置)還是有缺陷? – GlassZee

回答

1

基本上是一個跳躍的方程式是這樣的:

重力垂直適用,併產生恆定的力量向下。所以垂直速度是vy = vy0 - elapsedTime * g,其中g是重力常量,vy0是跳躍開始時的初始速度。

您不必計算已用時間。只需在每一幀,你這樣做:

vy -= g * dt; // dt is the elapsed time since last frame 

y += vy * dt; 
x += vx * dt; // vx doesn't change in the jump 
+0

我假定您發佈的代碼包含您在上面的段落中編寫的垂直速度。你確定增量值只用於'vy - = g * dt'這一行嗎?它看起來不錯,但在更新數量較低時,跳躍依然嚴重。 – GlassZee

+1

我真的很抱歉,我在x和y的更新中犯了一個愚蠢的錯誤,忘了在那裏乘以dt。它現在應該好多了。 –

2

玩家沒有「向上的力量」(除了在他們跳躍的那一刻)。部隊傳授勢頭產生速度。一旦在空中,他們確實感到向下的力(即重力),從而導致它們減速,最終產生負速度,使其返回到地面。

如果玩家開始以速度u向上跳躍,那麼在該跳躍開始之後的時間t處,用於計算位置的經典方程是y = ut + 0.5 * at^2

在這種情況下,a是重力(這是否定的,如果y是「向上」),得到y = u * t - 0.5 * g * t^2

相關問題