Java变量随机变化

时间:2012-08-14 03:08:56

标签: java opengl lwjgl

我正在开发一个粒子引擎,在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

Vector 3f http://tinyurl.com/9do6v2k

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

如果您想查看或了解其他任何内容,请通知我,但我认为这些都是相关信息。

2 个答案:

答案 0 :(得分:6)

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

Java通过引用传递东西 [共享对象(对象“引用”按值传递,因此每个人共享同一个对象)],因此每个粒子实例都引用相同的Vector3f对象他们的位置。

当你执行p.position.addTo(...)时,你正在改变粒子位置的所有,以及startPosition。

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

修改

克隆只是“构建具有相同值的新对象”的术语。您可以通过传递:

逐个案例地执行此操作
new Vector3f(startPosition.x, startPosition.y, startPosition.z)

而不是startPosition。

但这不是很强大,因为如果Vector3f获得某种状态,你需要更新这些调用。 请参阅Cloneable,了解一个可以让您拨打startPosition.clone()的界面。 [Err,脑冻]

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

答案 1 :(得分:2)

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

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

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

What's wrong with using == to compare floats in Java?