我在循环中运行以下函数。这是一个基本的弹跳球。我的问题是球的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 :(得分:1)
第一个明显的错误是你试图将速度乘以经过的时间......它不起作用。你要做的是在每次迭代时将速度(dx,dy)添加到你的(x,y)...所以忘记这个已经过去。
加速将始终存在...您不需要 if(ball.y&gt; 0)
当球触及极限(地板)时,由于调整 ball.y = 0 ,反转速度不够。当球真正触及极限时,你必须考虑球的准确速度。为了做到这一点,你必须在这里使用势能+ kinect能量概念(谷歌如果你想知道方程的细节)。
基本上这就是你想要的。
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;
}
复制并粘贴。它应该工作。我在这里所做的是测量球的总能量,然后在达到极限之前测量球的能量,加上球的kinect能量,然后达到极限。在那之后,我将这个能量完全转换回了kinect能量,所以它给了我一个新的快速,即接近极限时球的速度。 (像地板或其他任何东西)。