我有一些代码在屏幕上的随机位置显示10个椭圆,以及从屏幕顶部下降到底部的正方形,此时它会重置在顶部。我想要做的是当该方格通过任何椭圆时(通过比较它们的y位置)得到一个计数器来增加。然而,计数器迅速而不是稳定地增加,并且通常不会表现得理想。
这是我的draw()
功能。 barriers[i][0]
显然存储了x-pos,barriers[i][1]
y-pos。
void draw()
{
background(255);
fill(0);
for(int i = 0; i < barriers.length; i++) {
// Draw barriers
ellipse(barriers[i][0], barriers[i][1], 50, 50);
// Did we pass a barrier? (doesn't work!)
if(y >= barriers[i][0] - 1 && y <= barriers[i][1] + 1) {
counter++;
}
}
// Draw the square
rect(x, y, 25, 25);
// Draw counter alongside square
fill(255, 0, 0);
text(counter, x + 25, y - 5);
// Reset
if(y < height) {
y+=5;
} else {
y = -25;
counter = 0;
}
}
道歉,如果解决方案显而易见,但我在这里没有看到问题...
期待一些帮助。
答案 0 :(得分:2)
请看这段代码:
if(y >= barriers[i][0] - 1 && y <= barriers[i][1] + 1) {
counter++;
}
draw()
函数每秒触发60次,因此这段代码每秒会被触发60次。这意味着在您通过障碍时,counter
变量将每秒增加60次!
据推测,您只希望计数器为每个障碍增加一次。有很多方法可以做到这一点。您可以使用另一个数据结构来跟踪是否已经传递了每个障碍,然后仅检查尚未传递的障碍。或者你可以跟踪广场的先前位置,然后用它来确定广场何时开始通过障碍物。
想想你如何在没有电脑的情况下做到这一点。你怎么知道广场何时通过一个圆圈?在你的脑海中,你如何只为每个障碍计算一个?
答案 1 :(得分:0)
在Kevin's advice之后,我能够使用一系列布尔值来使用它,我用它来确保我不会多次递增counter
:
完整代码:
float barriers[][] = new float[10][2];
float x = 400;
float y = -25;
int counter = 0;
boolean barriersChecked[] = {false, false, false, false, false, false, false, false, false, false};
void setup()
{
size(800, 600);
genBarriers();
}
void genBarriers()
{
for (int i = 0; i < barriers.length; i++) {
barriers[i][0] = random(width);
barriers[i][1] = random(height);
}
}
void draw()
{
background(255);
fill(0);
for (int i = 0; i < barriers.length; i++) {
// Draw barriers
ellipse(barriers[i][0], barriers[i][1], 50, 50);
// Did we pass a barrier?
if (barriers[i][1] < y && !barriersChecked[i]) {
counter++;
barriersChecked[i] = true;
}
}
// Draw the square
rect(x, y, 25, 25);
// Draw counter alongside square
fill(255, 0, 0);
text(counter, x + 25, y - 5);
// Reset
if (y < height) {
y+=2;
} else {
y = -25;
genBarriers();
// Reset barriersChecked
for(int i = 0; i < barriersChecked.length; i++) {
barriersChecked[i] = false;
}
}
}
出于好奇,是否有更优雅(无环路)的方式将barriersChecked
中的每个元素重置回false
?
非常感谢有关其他改进的建议。