Я пишу программу, которая имитирует змею, и значения каждой секции змеи хранятся в массиве. Чтобы смоделировать физику змей, мне нужно присвоить следующий раздел предыдущему, где я столкнулся с проблемой.
int bar;
int foo;
void setup() {}
void draw() {
foo = bar;
bar = mouseX;
println(foo);
println(bar);
}
В этом примере не должна ли foo выходного бара указывать предыдущую позицию мыши? Bar назначается mouseX после того, как foo назначается bar. Делает ли оператор присваивания так, чтобы, если назначенная переменная изменяла назначаемую переменную, изменялись вместе с ней? Это очень расстраивает, и я думаю, что решение должно быть простым. Как назначить одну переменную другой, не обращая внимания на будущие изменения в ссылочной переменной?
РЕДАКТИРОВАТЬ: Вот пример симулятора змеи, который должен работать, но не по той же причине, все сегменты заканчиваются тем же самым в конце каждого цикла for:
int segments = int(random(3, 10));
float springing[] = new float[segments];
float damping[] = new float[segments];
PVector accel[] = new PVector[segments];
PVector[] joints = new PVector[segments];
PVector[] delta = new PVector[segments];
PVector food = new PVector(0,0,0);
void setup() {
size(500, 500);
stroke(255);
for(int n = 0; n < joints.length; n++) {
if (n == 0) joints[0] = new PVector(random(width), random(height));
else joints[n] = joints[0];
delta[n] = new PVector(0,0,0);
accel[n] = new PVector(0,0,0);
springing[n] = .05*(.07*(n+1));
damping[n] = .95-(.02*n);
}
}
void draw() {
background(0);
food.x = mouseX;
food.y = mouseY;
for(int n = 0; n < segments; n++) {
if (n == 0) {
delta[0] = PVector.sub(food, joints[0]);
joints[0].add(delta[0]);
}
else {
delta[n] = PVector.sub(joints[n-1], joints[n]);
delta[n].mult(springing[n]);
accel[n].add(delta[n]);
joints[n].add(accel[n]);
}
point(joints[n].x, joints[n].y);
accel[n].mult(damping[n]);
}
}