Java弹跳物理:永不停止反弹

时间:2016-01-13 17:23:11

标签: 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是一个int,它是对象的垂直速度

  • Bounce是一个浮动,控制&#34; bouncy&#34;一个对象是。例如0.5意味着它的反弹高度下降了一半

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

1 个答案:

答案 0 :(得分:1)

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

发生的事情是速度计算永远不会达到零,因为乘以最小数字float的结果可以表示一个值&gt; = .5本身。

我会通过在计算结果上设置一个低阈值来强制它为零:

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