我正在写一个物理引擎,当球碰到一个表面时,它反弹的速度是它下降时速度的一半(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,速度从正变为负,因此您在图片中看到的速度并非一直为负。忽略经过的时间变量java - libgdx java-如何在位置没有太大变化后阻止球反弹-LMLPHP非常感谢您的帮助!

最佳答案

为什么要让时间与它有关?我不是说不是,但是应该吗?因此,可能失去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

07-27 16:02