处理:当省略号的中点通过时递增计数器

时间:2016-06-02 07:32:31

标签: processing

我有一些代码在屏幕上的随机位置显示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;
  }
}

道歉,如果解决方案显而易见,但我在这里没有看到问题...

期待一些帮助。

2 个答案:

答案 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

非常感谢有关其他改进的建议。