【问题标题】:How to stop a ball from bouncing after the position hasnt changed much libgx java在位置没有太大变化后如何阻止球弹跳libgdx java
【发布时间】:2018-12-14 03:31:14
【问题描述】:

我正在编写一个物理引擎,当球撞击表面时,它会以它落下速度的一半弹起(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


    【解决方案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 &lt; topOfDarkBlueBox.y) position.y = topOfDarkBlueBox.y

    我宁愿看到物理学在起作用,但你可能会说,“谁会注意到?”

    编辑

    您写道,“碰撞处理程序知道它何时击中球的顶部”,但我假设您的意思是“当球击中深蓝色框的顶部时”。也许调用碰撞处理程序而不是传递新参数topOfDarkBlueBox

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    相关资源
    最近更新 更多