我不知道赋值运算符是如何工作的[处理]

时间:2011-01-16 07:29:31

标签: java processing

我正在编写一个模拟蛇的程序,蛇的每个部分的值都存储在一个数组中。为了模拟蛇物理,我需要将后续部分分配给前一个部分,这是我遇到问题的地方。

int bar;
int foo;

void setup() {}

void draw() {
  foo = bar;
  bar = mouseX;
  println(foo);
  println(bar);
}

在这个例子中,不应该输出bar的上一个鼠标位置?在将foo分配给bar后,将栏分配给mouseX。赋值运算符是否使得如果赋值的变量改变了赋值给它的变量?这非常令人沮丧,我认为解决方案应该很简单。如何将一个变量分配给另一个变量而忽略未来对所引用变量的更改?

编辑:这是一个应该工作的蛇模拟器的例子,但出于同样的原因,所有段在每个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 个答案:

答案 0 :(得分:2)

在您的示例中,foobar是原始类型,因此结果应符合您的期望。但是,如果它们是引用,那么你所写的内容将是不完整的。在这种情况下,构造函数可以帮助您保留变量的旧值。

您是否尝试在输入绘制方法时检查条形值并查看分配前后的实际值?

答案 1 :(得分:1)

draw()循环每秒运行多次。一旦它再次运行,foo就会被bar的值覆盖,bar的值与之前执行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都会在上一次执行draw()期间接受bar所具有的值(即mouseX),因为你的draw()循环将foo设置为当前的bar值