2013-05-10 88 views
2

我有以下函數在循環中運行。這是一個基本的彈跳球。我的問題是,球dy每次反彈都會增加。我會如何做到這一點,所以它每次都會彈到相同的高度?跳躍球獲得動力

function ballUpdate(elapsed) 
{ 
    var timeModifier = elapsed; 
    ball.x += (ball.dx*timeModifier); 
    ball.y += (ball.dy*timeModifier); 
    if(ball.y <= 0) 
    { 
     ball.dy *= -1; 
     ball.y = 0; 
    } 
    else if(ball.y > 0) 
    { 
     ball.dy += -.5*timeModifier; 
    } 
} 

function draw() 
{ 
    ball.update(); 
} 

function main(elapsed) 
{ 
    keyinput(elapsed); 
    ballUpdate(elapsed); 
} 

animLoop(main,draw,15); 
+0

請提供背景。代碼處於活動狀態的鏈接,一個jsfiddle或簡單的關於變量和功能角色的詳細解釋。 – 2013-05-10 18:07:46

+0

如何計算? – Jias 2013-05-10 18:09:07

回答

1
  1. 第一個明顯的錯誤是,你正在試圖通過在經過時間乘以速度......這是行不通的。你需要做的是在每次迭代中將速度(dx,dy)添加到你的(x,y)...所以忘掉這個已經過去了

  2. 加速性能將永遠存在......你不需要那麼如果(ball.y> 0)

  3. 由於調整的ball.y = 0當球沾上極限(地板),反轉速度是不夠的。當球真正接近極限時,你必須考慮球的確切速度。爲了做到這一點,你必須在這裏使用勢能+ kinect能量的概念(如果你想知道方程的細節,Google會爲你提供)。


基本上這是你想要的。

function ballUpdate(elapsed) 
{ 
    var acceleration = -0.5; 

    ball.x += ball.dx; 
    ball.y += ball.dy; 

    if (ball.y <= 0) 
    { 
     ball.dy = Math.sqrt(-2 * acceleration * (ball.y - ball.dy) + ball.dy * ball.dy); 
     ball.y = 0; 
    } 

    ball.dy += acceleration; 
} 

複製並粘貼。它應該工作。我在這裏所做的就是在球達到極限之前,將球的總能量作爲勢能加上球的運動能量。之後,我將這一數量的能量完全轉化爲動能,所以它給了我一個新的速度,即接近極限時的速度。 (如地板或其他任何東西)。