处理:在for循环中的if条件中使用全局数组的麻烦

时间:2017-05-27 23:36:21

标签: java conditional processing

我正在尝试编写一个具有给定数量的球的小程序(在它下面的示例代码中,3)以不同的速度和阶段(开始偏移)在屏幕上来回移动。 在代码中已经实现了这么多。虽然我希望能够使用鼠标点击选择球(一次一个)。 我用了#34; HIT !!!"在控制台中表示已点击一个球。

我的问题是,当我运行下面的代码时,我只得到一个" HIT!"在我点击顶部球时在控制台中。这是第一个元素y [0]与click_Y变量匹配的时间。当我确定(但显然有点误会)当我点击y [1]&附近时应该有匹配Y [2]。

我真的很感激任何帮助。因为它已经到了我开始茫然地盯着屏幕的地步。感谢。

int     noCircles;    // the number of items in the array (# of circles)
float[] y;      // y-position of each circle (fixed)
float[] speed;  // speed of each circle
float[] phase;  // phase of each circle

float red = 120;
float green = 120;
float blue = 120;

float click_X;
float click_Y;
void setup() {
  size(500, 500);

  noCircles = 3;

  // allocate space for each array
  y = new float[noCircles];
  speed = new float[noCircles];
  phase = new float[noCircles]; 

 // calculate the vertical gap between each circle based on the total number 
 // of circles
  float gap = height / (noCircles + 1);

  //setup an initial value for each item in the array
  for (int i=0; i<noCircles; i++) {
    y[i] = gap * (i + 1);
    // y is constant for each so can be calculated once
    speed[i] = random(10);
    phase[i] = random(TWO_PI);
  }
}
void draw() {
  background(155);

  for (int i=0; i<noCircles; i++) {
    // calculate the x-position of each ball based on the speed, phase and 
    //current frame
    float x = width/2 + sin(radians(frameCount*speed[i] ) + phase[i])* 200; 
    if (dist(x, y[i], click_X, click_Y) <= 20){
        println("HIT!!!!!!!!!!!!!!!!!!");
    }
    ellipse(x, y[i], 20, 20);
    click_X = 0;
    click_Y = 0;
  }
 }
void mousePressed() {
  println("You clicked******************************************");
  click_X = mouseX;
  click_Y = mouseY;
  println("click_X =" +  click_X);
  println("click_Y =" +  click_Y);
}

1 个答案:

答案 0 :(得分:1)

这些问题最好通过debugging程序来解决。首先手动跟踪代码,然后添加打印语句(超过您已经添加的内容),如果这样做不起作用,那么不要害怕使用调试器。

您正在使用click_Xclick_Y变量来检查鼠标相对于每个球位置的位置。跟踪for函数中的draw()循环。在第一次迭代结束时会发生什么?

您重置了click_Xclick_Y的值。这就是为什么你没有检测到其他圈子的任何点击的原因。

您可能可能会重构您的代码,只有在遇到某些内容时才重置这些变量,但实际上,我会完全停止使用它们。

我猜你正在使用这些变量,因为你只想检查鼠标何时被按下?只需使用mousePressed变量即可。然后,您可以直接使用mouseXmouseY变量。

然后您的if语句将如下所示:

if (mousePressed && dist(x, y[i], mouseX, mouseY) <= 20) {
  println("HIT: " + i);
}

此外,使用像这样的单独数组称为并行数组,并且通常是一个坏习惯。您应该使用classes代替。