如何阻止球在位置没有变化之后弹跳libgx java

时间:2015-10-14 16:06:24

标签: java libgdx

我正在编写一个物理引擎,当球击中一个表面时,它以一半的速度反弹(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,速度从正变为负,因此您在图片中看到的速度不会持续为负。忽略已用时间变量The ball is the only thing moving非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

为什么让时间与它有关?我不是说它不应该,但它应该吗?所以可能会丢失if(elapsedTime ... )条件。

这不是你想要的吗? 如果最后两个位置之间的垂直差异的大小可以忽略不计(相应地设置tolerance;也许它是5),停止弹跳:< / p>

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

我宁愿在工作中看到物理,但你可能会说,&#34;谁注意到了?&#34;

修改

你写道,&#34;碰撞处理程序知道它何时击中球的顶部,&#34;但我认为你的意思是#34;当球击中深蓝色盒子的顶部时#34;。也许调用碰撞处理程序而不是传递新参数topOfDarkBlueBox