Java反弹物理: never ending bounce

标签 java physics infinite bounce

我最近开始用java编写游戏。我有 C#/XNA 背景,并且已经拥有游戏开发经验。 但是我的java游戏遇到了问题。我有一个弹跳脚本,可以使游戏中的“粒子”在与固体表面(例如地面)碰撞时弹起。 这是管理弹跳的代码片段。

private final void respondY(Rectangle r)
{
    if(!r.intersects(getBounds())) // If not colliding, return
        return;

    if(Yvel > 0) // If falling...
    {
        if(r.y < Y + Height) //Another collision test
        {
            Y = r.y - Height; // Set Y to top of object
            Yvel *= -bounce; // Bounce (Here is the problem)
            onFloor = true;
        }
    }
    else if(Yvel < 0) // If hit ceiling
    {
        if(Y < r.y + r.height) // Collision test
        {
            Y = r.y + r.height; // Set Y to bottom of object
            Yvel = 0; // No bouncing here
        }
    }
}

问题是物体在地板上按其应有的方式弹跳,但过了一会儿,物体在相同的高度上不断弹跳,我希望它在达到恒定高度时停止弹跳。

注意:

  • Yvel 是一个整数,表示物体的垂直速度

  • Bounce 是一个 float ,用于控制对象的“弹性”程度。例如0.5 表示反弹高度是下跌高度的一半

提前致谢!请注意,这是我的第一篇文章,因此如果我犯了错误,请以建设性的方式指出。

最佳答案

float(和double)类型不精确。在处理非常小的数字时,这尤其会引起问题 - 事实上,存在最小的可表示数字和有限数量的可以表示的可能数字(有点像量子物理学)。 float 存储的数字实际上是最接近计算结果的数字。

发生的情况是速度计算永远不会达到零,因为 float 可以表示的最小数字乘以 >= .5 的值,其结果就是它本身。

我会通过对计算结果设置一个较低的阈值来强制其为零:

Yvel = Yvel * -bounce;
if (Yvel < .000001F)
    Yvel = 0;

关于Java反弹物理: never ending bounce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34773090/

相关文章:

java - 从 android 中的 AccessibilityService 创建对 Activity 的回调

java - 在java中使用它们创建数组时如何准备不合适的用户输入

java - 当一个类实现一个监听器接口(interface)来监听扩展 BroadcastReceiver 的类中记录的变化时,没有任何反应

javascript - 计算圆的速度

debugging - cuda无限内核

list - Haskell-将两个列表放入一个元组列表中

java - 在 Java 中进行对象到对象转换的简单/优雅的方法?

c# - 使用 GPU 加速 BigInteger 计算

java - 重写,以便 Math.atan() 无论方向如何都可以工作

list - 无法检测无限循环的原因