gpt4 book ai didi

Java反弹物理: never ending bounce

转载 作者:行者123 更新时间:2023-11-30 07:40:26 26 4
gpt4 key购买 nike

我最近开始用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com