我正在写一个物理引擎,当球碰到一个表面时,它反弹的速度是它下降时速度的一半(velocity.y = -velocity)。但是,当球快要静止时,它会不断地切换速度,并开始缓慢地滑落到平台上,但是如果我让它运行足够长的时间,仍然会最终掉落,这是不可接受的。我尝试编写一些代码来停止它,但是它检查的速度太快了,这里是尝试检查它的更新方法。
public void update() {
velocity.y += Globals.GRAVITY.y;
if(canFall)
position.y += velocity.y;
position.x += velocity.x;
oldPosition.y = position.y;
oldPosition.x = position.x;
elapsedTime += 1 * Gdx.graphics.getDeltaTime();
if(elapsedTime >= 5){
if(oldPosition.y - 5 <= position.y && oldPosition.y + 5 >= position.y){
elapsedTime = 0;
canFall = false;
}else{
canFall = true;
elapsedTime = 0;
}
}
}
碰撞处理程序知道何时击中球的顶部,这是我为此所需的唯一解决方案。我如何检查球何时静止。
此代码尝试检查球是否在几秒钟内没有移动,如果没有,则将
canFall
设置为false
。我需要一个通用检查,看球是否应该停下来。球从平台掉落时的速度,您可以从下图看到。图片显示了十秒钟后球处于“静止”状态,因此您可以看到球正在缓慢但必定会掉入。在此“静止”速度下,每三秒钟y位置下降1,速度从正变为负,因此您在图片中看到的速度并非一直为负。忽略经过的时间变量非常感谢您的帮助! 最佳答案
为什么要让时间与它有关?我不是说不是,但是应该吗?因此,可能失去if(elapsedTime ... )
条件。
这不是你想要的吗?如果最后两个位置之间的垂直差的幅度可以忽略不计(相应地设置tolerance
;也许是5),请停止弹跳:
if(Math.abs(position.y - oldPosition.y) < tolerance)
{
canBounce = false;
...
}
else
{
canBounce = true;
...
}
或者,如果在上述
...
上没有其他需要更改的内容,则:canBounce = Math.abs(position.y - oldPosition.y) > tolerance;
另外,在下面的代码段中的某处是否不需要
{
和}
?也许不是,如果球垂直跳动,但x
似乎也可以更改,这可能会使上面的代码需要调整。但是下面代码的缩进方式使我认为应该做的不仅仅是改变position.y
:if(canFall)
position.y += velocity.y;
position.x += velocity.x;
oldPosition.y = position.y;
oldPosition.x = position.x;
最后,将速度添加到位置。这似乎值得怀疑。将速度乘以时间?还是时间= 1总是? (对此感到怀疑。)
问题可能在此方法之外。需要采取一些措施来防止球的
y
变得小于深蓝色框顶部的y
。如果不知道暗蓝色框顶部的y
,则此代码无法执行此操作(除非您应用物理公式?)。也许将此值作为topOfDarkBlueBox
包含在参数列表中?然后添加如下代码:
if(position.y < topOfDarkBlueBox.y) position.y = topOfDarkBlueBox.y
我宁愿看到物理在工作,但您可能会说,“谁会注意到?”
编辑
您写道:“碰撞处理程序知道它何时击中了球的顶部,”但我想您的意思是“当球击中了深蓝色框的顶部时”。也许调用碰撞处理程序而不是传递新参数
topOfDarkBlueBox
?