Java ArrayList中的类彼此更新属性

Java ArrayList中的类彼此更新属性,java,libgdx,Java,Libgdx,我正在LibGDX中创建小型烟花模拟。我有一个名为粒子的ArrayList,它正在填充: for (int i = 0; i < 2; i++) { Particle p = new Particle(); p.position = position; p.velocity.x = MathUtils.random(-1f, 1f); p.velocity.y = MathUtils.random(-1f, 1f); particles.add(p

我正在LibGDX中创建小型烟花模拟。我有一个名为
粒子
的ArrayList,它正在填充:

for (int i = 0; i < 2; i++) {
    Particle p = new Particle();
    p.position = position;
    p.velocity.x = MathUtils.random(-1f, 1f);
    p.velocity.y = MathUtils.random(-1f, 1f);

    particles.add(p);
}
速度是随机的,每个粒子都有唯一的速度,但位置是相同的。以下是输出:
0(300.0620.91364)+(-0.94489133,-0.45628428)=
(299.0551,620.45734)
1 (299.0551,620.45734) + (0.3956585,0.5208683) = 
(299.45078,620.9782)
0 (299.45078,620.9782) + (-0.94489133,-0.45628428) = 
(298.5059,620.5219)
1 (298.5059,620.5219) + (0.3956585,0.5208683) = 
(298.90155,621.0428)
0 (298.90155,621.0428) + (-0.94489133,-0.45628428) = 
(297.95667,620.5865)
1 (297.95667,620.5865) + (0.3956585,0.5208683) = 
(298.35233621.10736)

首先是粒子指数、位置、速度,然后是输出位置


为什么它使用另一个粒子的位置?我正试图找出答案,但我做不到。

在您的for循环中,在您填写ArrayList的地方,您有一行:

p.position = position;
我不知道
position
从哪里来,但这里所有的粒子指向同一个方向

必须为每个粒子创建一个新位置

p.position = new Position(x, y);
如果
position
是粒子的起点,则可以编写:

p.position = new Position(position.x, position.y);

在填充ArrayList的for循环中,有一行:

p.position = position;
我不知道
position
从哪里来,但这里所有的粒子指向同一个方向

必须为每个粒子创建一个新位置

p.position = new Position(x, y);
如果
position
是粒子的起点,则可以编写:

p.position = new Position(position.x, position.y);

粒子
类中重用
位置
对象。它们引用所有相同的
位置
对象。检查代码中的
new Position()
位置(假设这是类名),以及这一行在代码中执行的频率。这种错误非常常见,也是现代编码准则建议使类不可变的原因之一。(例如,java 8中引入的java.time包中的所有类都是不可变的。)@DodgyCodeException在java游戏中使用不可变类的问题是,它会导致GC搅动,这会导致帧速率几乎不受影响。不幸的是,Java没有结构。您在
粒子
类中重用
位置
对象。它们引用所有相同的
位置
对象。检查代码中的
new Position()
位置(假设这是类名),以及这一行在代码中执行的频率。这种错误非常常见,也是现代编码准则建议使类不可变的原因之一。(例如,java 8中引入的java.time包中的所有类都是不可变的。)@DodgyCodeException在java游戏中使用不可变类的问题是,它会导致GC搅动,这会导致帧速率几乎不受影响。不幸的是,Java没有结构。