Я не знаю, как работает оператор присваивания [обработка] - PullRequest
1 голос
/ 16 января 2011

Я пишу программу, которая имитирует змею, и значения каждой секции змеи хранятся в массиве. Чтобы смоделировать физику змей, мне нужно присвоить следующий раздел предыдущему, где я столкнулся с проблемой.

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]);
  }
}

Ответы [ 2 ]

2 голосов
/ 16 января 2011

В вашем примере foo и bar являются примитивными типами, поэтому результаты должны соответствовать вашим ожиданиям. Если бы они были ссылками, то, что вы написали, было бы неполным. В таком случае конструктор поможет вам сохранить старое значение переменной.

Вы пытались проверить значение бара при входе в метод рисования и посмотреть, что это на самом деле до и после назначения?

1 голос
/ 16 января 2011

Цикл draw () запускается много раз в секунду.Как только он снова запустится, foo перезаписывается значением bar, которое имеет позицию мыши x по сравнению с предыдущим выполнением draw ().Я думаю, что вы можете увидеть это более четко, если вы измените операторы println на:

println("foo: " + foo + " bar: " + bar);

Тогда, если вы запустите свой набросок при перемещении мыши, вы увидите записи типа:

foo: 76 bar: 84
foo: 84 bar: 91
foo: 91 bar: 97
foo: 97 bar: 97

Как и ожидалось, каждый раз, когда draw () выполняется, foo принимает значение, которое было у bar (то есть mouseX) во время последнего выполнения draw (), потому что ваш цикл draw () продолжает устанавливать foo текущее значение bar.

...