为何final修饰的PVector变量每帧自动变化?粒子系统位置异常排查
问题原因与解决方案
核心问题
你观察到PartSys类中final PVector Pos位置持续变化,本质是引用类型的final修饰符仅限制引用本身不可被重新赋值,但对象内部的属性仍然可以被修改。
具体分析
- 你创建
Particle实例时,应该是直接将PartSys.Pos传入了构造函数(类似Particles.add(new Particle(Pos)))。 Particle构造函数里的this.pos = pos;,是把PartSys.Pos的引用赋值给了Particle的pos成员变量——两者指向同一个PVector对象。- 每帧执行
part.Display()时,pos.add(PVector.random2D().limit(7))会直接修改这个共享PVector对象的x、y属性,也就是PartSys.Pos的内部值,所以你会看到它的位置持续变动。
修复方案
创建Particle时,传入PartSys.Pos的副本而非原引用,避免修改原对象:
- 方式1:利用Processing内置的
PVector.copy()方法:
// 创建粒子时的代码 Particles.add(new Particle(Pos.copy()));
- 方式2:手动创建新的
PVector对象:
// 创建粒子时的代码 Particles.add(new Particle(new PVector(Pos.x, Pos.y)));
也可以修改Particle的构造函数,自动复制传入的向量,从根源避免外部调用出错:
class Particle { PVector pos = new PVector(); void Display() { pos.add(PVector.random2D().limit(7)); } Particle(PVector pos) { this.pos = pos.copy(); // 改为复制传入的向量 } }
内容的提问来源于stack exchange,提问作者user15945786
相关产品推荐
相关产品推荐

