Matrixes和for循环变得不一致?

时间:2017-09-07 23:54:25

标签: java matrix processing rect

这是我之前提问here的后续帖子。我得到了一个非凡的回应,而不是使用数组数据跟踪,使用矩阵。现在,这里的代码按计划工作(例如,大部分时间的矩形都用白色填充),但它的非常不一致。当按住鼠标左键或右键时,颜色会在随机性的战斗中相互叠加,而且我几乎不知道为什么会发生这种情况。仅供参考,我在Processing 3中使用Java。

这是我对项目所做的结果。如你所见,它看起来很好。

Snapshot of my project

当悬停在rect上时抖动除外,并且在一半的时间内不会填充矩形。而且,悬停颜色几乎是随机循环的。

int cols, rows;
int scl = 20;
boolean[][] matrix = new boolean[scl+1][scl+1];

void setup() {
  size(400, 400);
  int w = 400;
  int h = 400;
  cols = w / scl;
  rows = h / scl;
}

void draw() {
  background(255);
  for (int x = 0; x < cols; x++) {
    for (int y = 0; y < rows; y++) {
      int xpos = x*scl;
      int ypos = y*scl;

stroke(55);
  if ((mouseX >= xpos && mouseX <= xpos+scl) &&
    (mouseY >= ypos && mouseY <= ypos+scl)) {
    fill(75);
    if (mousePressed == true) {
      println("Clicked at: " + xpos + " and " + ypos);
      if (!matrix[xpos/scl][ypos/scl]) {
        matrix[xpos/scl][ypos/scl] = true;

      } else {
        matrix[xpos/scl][ypos/scl] = false;
      }
      fill(100);
      //here is the desired location for the fill to remain constant even 
      //after unclicking and leaving hover
    }
    println("Mouse at: " + xpos + " and " + ypos);
  } else {
    fill(50);
  }
  if (matrix[x][y]) {
    //fill(204, 102, 0);
    fill(240);
    rect(xpos, ypos, scl, scl);
  }
  rect(xpos, ypos, scl, scl);
    }
  }
}

1 个答案:

答案 0 :(得分:1)

记住,Processing每秒触发draw()函数60次。

因此,检查是否按下鼠标每秒发生60次。这意味着你可以每秒60次切换鼠标任何单元格的状态。

要解决此问题,您可以切换到使用mousePressed()等事件函数,而不是每帧都不断轮询。

来自the reference

int value = 0;

void draw() {
  fill(value);
  rect(25, 25, 50, 50);
}

void mousePressed() {
  if (value == 0) {
    value = 255;
  } else {
    value = 0;
  }
}

对于某些单元格被跳过,这是因为当您移动鼠标时,它实际上并没有遍历每个像素。它&#34;跳跃&#34;从一帧到另一帧。那些跳跃通常很小,以至于人类没有注意到它,但它们足够大,以至于它跳过细胞。

对此的一个解决方案是使用pmouseXpmouseY变量来计算从前一个鼠标位置到当前鼠标位置的一条线,并填写任何沿着该位置被击中的单元格。方式。