1

我正在开发一个粒子引擎,在 Windows 7 上的 Eclipse 中,我遇到了一个我以前从未见过的问题。我的代码中有这个:

float start = startPosition.getY();
p.position.addTo(p.moveVector);

float end = startPosition.getY();
if(start != end){
System.out.println("hit");
}

而且它确实经常受到影响。我这样做的原因是 startPosition 被改变了,它弄乱了我的程序。

我还进入调试器并查看打印机命中时的值,我得到了这个,所有变量都在位置和 moveVector:1.0E-5 我不知道该怎么做。

这是我的代码。

粒子发射器http://tinyurl.com/9ahwodx

粒子http://tinyurl.com/8rw979d

矢量 3f http://tinyurl.com/9do6v2k

有问题的代码位于 ParticleEmitter 的底部。

如果您想查看或了解其他任何信息,请告诉我,但我认为这就是所有相关信息。

4

2 回答 2

6

您的particleEmiter 构造函数创建了一堆Particle 对象,每个对象的位置为startPosition。

Java 通过引用传递事物[共享对象(对象“引用”通过值传递,因此每个人都共享同一个对象)],因此您的每个 Particle 实例都针对它们的位置引用同一个 Vector3f 对象。

当您执行 p.position.addTo(...) 时,您将更改所有Particle 的位置,以及 startPosition。

调用 Particle 构造函数时需要克隆位置。

编辑:

克隆只是“构造具有相同值的新对象”的术语。您可以通过以下方式逐案执行此操作:

new Vector3f(startPosition.x, startPosition.y, startPosition.z)

而不是开始位置。

但这不是很健壮,因为如果 Vector3f 要获得某种状态,则需要更新这些调用。 请参阅Cloneable以获取可以让您直接调用的接口startPosition.clone() [呃,大脑冻结]

编辑 2:或者如指出的那样,在 Vector3f 上放置一个带有 Vector3f 参数的构造函数。new Vector3f(startPosition)当您将位置传递给 Particle 构造函数时,您的代码就变成了。

于 2012-08-14T03:21:16.777 回答
2

要回答您的第一个问题,1.0E-5 基本上为零。

总的来说,我认为你的问题是你试图比较float变量是否相等,这绝不是一件好事。我的猜测是这些值实际上并没有“改变”,而是每次运行用于的浮点近似值时startend它们的表示方式都会有所不同。这将解释您所看到的行为,其中相同的代码似乎每次表现都有些不同。

查看此内容以获取更多详细信息:

在 Java 中使用 == 比较浮点数有什么问题?

于 2012-08-14T03:12:52.483 回答