Java bounce物理学:永无止境的反弹

Java bounce物理学:永无止境的反弹,java,physics,infinite,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 >

我最近开始用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
        }
    }
}
private最终无效响应(矩形r)
{
如果(!r.intersects(getBounds())//如果不冲突,则返回
返回;
如果(Yvel>0)//如果下降。。。
{
if(r.y
问题在于,物体在地板上的反弹是它应该的,但过了一段时间,物体会在我希望它达到恒定高度时停止反弹的相同高度上不断反弹。

注:

  • Yvel是一个int,表示对象的垂直速度

  • “反弹”是一个浮动,用于控制对象的“反弹”程度。e、 g.0.5意味着它反弹的高度是下降高度的一半

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

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

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

我会在计算结果上设置一个较低的阈值,将其强制为零:

Yvel = Yvel * -bounce;
if (Yvel < .000001F)
    Yvel = 0;
Yvel=Yvel*-反弹;
如果(Yvel<.000001F)
Yvel=0;

感谢您的及时回复,但当我尝试此操作时,问题仍然存在。“if(Yvel<0)”线完全阻止对象反弹,如果移除,对象仍在相同高度反弹。将.0001f更改为更大的值(如.01f)会使恒定反弹高度变小,但它仍然存在。。。也许可以用Math.round()…EDIT做些什么:在我写最后一条评论时,我没有在你的答案中看到你的编辑,我目前正在尝试检测一个对象是否重复反弹到相同的高度,如果是这样的话,当它落地时停止该对象。