我正在使用Windows 7上的Eclipse中的粒子引擎,我遇到了一个我从未见过的问题.我的代码中有这个:
float start = startPosition.getY();
p.position.addTo(p.moveVector);
float end = startPosition.getY();
if(start != end){
System.out.println("hit");
}
Run Code Online (Sandbox Code Playgroud)
它经常打印.我这样做的原因是因为startPosition正在改变,它搞砸了我的程序.
我也进入调试器并查看打印机命中时的值,我得到了这个结果,所有变量都在位置和moveVector:1.0E-5我不知道该怎么做.
这是我的代码.
粒子发射器http://tinyurl.com/9ahwodx
矢量3f http://tinyurl.com/9do6v2k
有问题的代码位于ParticleEmitter的底部.
如果你想看到或知道别的什么让我知道,但我认为这是所有相关的信息.
您的particleEmiter构造函数创建了一堆Particle对象,其中startPosition作为每个对象的位置.
Java通过引用传递东西[共享对象(对象"引用"通过值传递,因此每个人共享相同的对象)],因此每个粒子实例都为其位置引用相同的Vector3f对象.
当你执行p.position.addTo(...)时,你正在改变所有粒子的位置,以及startPosition.
调用Particle构造函数时需要克隆位置.
编辑:
克隆只是"构建具有相同值的新对象"的术语.您可以通过以下方式逐个执行此操作:
new Vector3f(startPosition.x, startPosition.y, startPosition.z)
Run Code Online (Sandbox Code Playgroud)
而不是startPosition.
但这不是很强大,因为如果Vector3f获得某种状态,你需要更新这些调用. 请参阅Cloneable以获取可让您调用的接口 [错误,脑冻]startPosition.clone().
编辑2:或者作为指出,在Vector3f上放置一个带有Vector3f参数的构造函数.new Vector3f(startPosition)当您将位置传递给Particle构造函数时,您的代码就会变为.