我正在开发一个粒子引擎,在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
Vector 3f http://tinyurl.com/9do6v2k
有问题的代码位于ParticleEmitter的底部。
如果您想查看或了解其他任何内容,请通知我,但我认为这些都是相关信息。
答案 0 :(得分:6)
您的particleEmiter构造函数创建了一堆Particle对象,其中startPosition作为每个对象的位置。
Java通过引用传递东西 [共享对象(对象“引用”按值传递,因此每个人共享同一个对象)],因此每个粒子实例都引用相同的Vector3f对象他们的位置。
当你执行p.position.addTo(...)时,你正在改变粒子位置的所有,以及startPosition。
调用Particle构造函数时需要克隆位置。
修改强>
克隆只是“构建具有相同值的新对象”的术语。您可以通过传递:
逐个案例地执行此操作new Vector3f(startPosition.x, startPosition.y, startPosition.z)
而不是startPosition。
但这不是很强大,因为如果Vector3f获得某种状态,你需要更新这些调用。 请参阅Cloneable,了解一个可以让您拨打 [Err,脑冻] startPosition.clone()
的界面。
编辑2:或者作为指出,在Vector3f上放置一个带有Vector3f参数的构造函数。当您将位置传递给Particle构造函数时,您的代码将变为new Vector3f(startPosition)
。
答案 1 :(得分:2)
要回答您的第一个问题,1.0E-5基本上为零。
总的来说,我认为你的问题是你试图比较float
变量的平等,这绝不是一件好事。我的猜测是,这些值实际上并没有“改变”,而是每次运行用于start
和end
的浮点近似时,表示方式有点不同。这可以解释您所看到的行为,每次相同的代码看起来有点不同。
查看此内容以获取更多详细信息: