我正在使用Windows 7上的Eclipse开发粒子引擎,但遇到了一个我从未见过的问题。
我的代码中有这个:
float start = startPosition.getY();
p.position.addTo(p.moveVector);
float end = startPosition.getY();
if(start != end){
System.out.println("hit");
}
而且它确实经常打印。
我这样做的原因是因为startPosition被更改,并且弄乱了我的程序。
我还进入了调试器,并在打印机命中时查看了这些值,并将其作为结尾,所有变量都位于position和moveVector:1.0E-5
我不知道该怎么做。
这是我的代码。
粒子发射器http://tinyurl.com/9ahwodx
粒子http://tinyurl.com/8rw979d
矢量3f http://tinyurl.com/9do6v2k
有问题的代码在ParticleEmitter的底部。
如果您想查看或了解其他任何信息,请告诉我,但我想这就是所有相关信息。
最佳答案
您的particleEmiter构造函数创建了一堆粒子对象,每个对象的位置都为startPosition。
Java通过引用传递对象(共享对象(对象“引用”通过值传递,因此每个人都共享同一对象)),因此,每个Particle实例的位置均引用相同的Vector3f对象。
当执行p.position.addTo(...)时,您将更改所有粒子的位置以及startPosition。
调用“粒子”构造函数时,您需要克隆位置。
编辑:
克隆只是“构造具有相同值的新对象”的术语。您可以通过以下方式根据具体情况进行操作:
new Vector3f(startPosition.x, startPosition.y, startPosition.z)
而不是startPosition。
但是,这并不是很可靠,因为如果Vector3f要获得某种状态,则需要更新这些调用。有关允许您仅调用
startPosition.clone()
的接口,请参见Cloneable。 [Err,大脑冻结]编辑2:或指出,在Vector3f上放置一个带有Vector3f参数的构造函数。将位置传递给Particle构造函数时,代码将变为
new Vector3f(startPosition)
。