处理:在for循环中使用全局数组遇到问题
问题描述:
我正在尝试编写一个具有给定数量球(在下面的示例代码中为3)的小程序,以不同的速度在屏幕上来回移动,阶段(开始偏移)。 这在代码中已经实现了很多。尽管我希望能够使用鼠标点击来选择球(一次一个)。 我已经使用了“HIT !!!”这个词。在控制台中表示一个球已被点击。处理:在for循环中使用全局数组遇到问题
我的问题是,当我运行下面的代码时,我只得到一个“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);
}
答
像这样的问题最好通过debugging您的程序解决。首先手动追踪代码,然后添加打印语句(比已添加的更多),如果这样做不起作用,那么不要害怕使用调试器。
您正在使用click_X
和click_Y
变量来检查鼠标相对于每个球位置的位置。在draw()
函数中跟踪for
循环。第一次迭代结束时会发生什么?
您重置click_X
和click_Y
的值。这就是为什么你没有在其他圈子上发现任何点击。
你可能可以重构你的代码,只重置这些变量,如果有东西被击中,但真的,我会停止使用它们。
我猜你正在使用这些变量,因为你只想检查鼠标被按下的时间?只需使用mousePressed
变量即可。然后,您可以直接使用mouseX
和mouseY
变量。
然后你if
声明是这样的:
if (mousePressed && dist(x, y[i], mouseX, mouseY) <= 20) {
println("HIT: " + i);
}
此外,使用单独的阵列像这被称为并行阵列,并且是一般的坏习惯进入。您应该改为使用classes。
感谢您的回复。是的,我有一些倾斜重置Click_X和Click_Y与它有关。我已经评论了这些线。尽管没有重新设置这些变量,因为每当一个球越过我点击的点时获得了多个“HIT”,而我只希望每次点击一次。正如你所说,虽然我必须找到另一种方式来处理这个问题。谢谢你的一些非常合理的建议! – HiSulu
我将行'click_X = 0;'和'click_Y = 0'在代码中放下几行,以便它们在for循环之外,但它们仍然被重置,以便即使球没有被直接击中,它们也不会“悬停”而导致命中。我知道这可能不是最佳做法。但它现在给我一些解脱和喘息的空间。我会重构。再次感谢凯文! – HiSulu
@HiSulu我建议你完全摆脱这些变量。只要删除它们。我发布的'if'声明显示了你到底该做什么。 –