我最近开始用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意味着它的反弹高度下降了一半
提前致谢!请注意,这是我的第一篇文章,所以如果我犯了错误,请以建设性的方式指出。
答案 0 :(得分:1)
float
(和double
)类型不精确。当处理非常小的数字时,这尤其会引起问题 - 事实上,这是一个最小的可表示数字和可以表示的有限数量的可能数字(和量子物理学一样)。 float
存储的数字实际上是可能代表计算结果的最接近的数字。
发生的事情是速度计算永远不会达到零,因为乘以最小数字float
的结果可以表示一个值&gt; = .5本身。
我会通过在计算结果上设置一个低阈值来强制它为零:
Yvel = Yvel * -bounce;
if (Yvel < .000001F)
Yvel = 0;