Java变量随机变化

Ele*_*ec0 1 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");
}
Run Code Online (Sandbox Code Playgroud)

它经常打印.我这样做的原因是因为startPosition正在改变,它搞砸了我的程序.

我也进入调试器并查看打印机命中时的值,我得到了这个结果,所有变量都在位置和moveVector:1.0E-5我不知道该怎么做.

这是我的代码.

粒子发射器http://tinyurl.com/9ahwodx

粒子http://tinyurl.com/8rw979d

矢量3f http://tinyurl.com/9do6v2k

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

如果你想看到或知道别的什么让我知道,但我认为这是所有相关的信息.

Mar*_*tin 6

您的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构造函数时,您的代码就会变为.

  • 更多链接!http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java.最简单的方法是创建一个形式为`public Vector3f(Vector3f original)`的构造函数,从原始文件创建一个新的Vector3f. (2认同)