Я пишу программу, имитирующую змею, и значения каждой части змеи хранятся в массиве. Чтобы смоделировать физику змеи, мне нужно назначить последующий раздел предыдущему, и здесь я столкнулся с проблемой.
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]);
}
}