2013-05-10 85 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; 
} 

复制并粘贴。它应该工作。我在这里所做的就是在球达到极限之前,将球的总能量作为势能加上球的运动能量。之后,我将这一数量的能量完全转化为动能,所以它给了我一个新的速度,即接近极限时的速度。 (如地板或其他任何东西)。