处理:在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_Xclick_Y变量来检查鼠标相对于每个球位置的位置。在draw()函数中跟踪for循环。第一次迭代结束时会发生什么?

您重置click_Xclick_Y的值。这就是为什么你没有在其他圈子上发现任何点击。

你可能可以重构你的代码,只重置这些变量,如果有东西被击中,但真的,我会停止使用它们。

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

然后你if声明是这样的:

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

此外,使用单独的阵列像这被称为并行阵列,并且是一般的坏习惯进入。您应该改为使用classes

+0

感谢您的回复。是的,我有一些倾斜重置Click_X和Click_Y与它有关。我已经评论了这些线。尽管没有重新设置这些变量,因为每当一个球越过我点击的点时获得了多个“HIT”,而我只希望每次点击一次。正如你所说,虽然我必须找到另一种方式来处理这个问题。谢谢你的一些非常合理的建议! – HiSulu

+0

我将行'click_X = 0;'和'click_Y = 0'在代码中放下几行,以便它们在for循环之外,但它们仍然被重置,以便即使球没有被直接击中,它们也不会“悬停”而导致命中。我知道这可能不是最佳做法。但它现在给我一些解脱和喘息的空间。我会重构。再次感谢凯文! – HiSulu

+0

@HiSulu我建议你完全摆脱这些变量。只要删除它们。我发布的'if'声明显示了你到底该做什么。 –