我正在使用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)

10-08 13:43