Создание интерактивной сетки в обработке 3 - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать сетку из квадратов, которые меняют свою заливку (с черного на белый и наоборот) при нажатии. В настоящее время я могу включить или отключить всю сетку, но не могу понять, как указать, какой именно квадрат следует переключать, когда мышь щелкает в пределах его границ. Я создавал кнопки, используя координаты mouseX и mouseY, но они предназначались для конкретных объектов, которые я мог настроить вручную. Я не могу понять, как это сделать, используя для циклов и массивов.

Мне сказали создать логический массив и передать значение этого массива в массив сетки, но, опять же, я не знаю, как указать, к какой части массива он должен идти. Например, как мне изменить значение заполнения квадрата [6] [3] при нажатии мыши?

Вот мой код:

int size = 100;
int cols = 8;
int rows = 5;
boolean light = false;
int a;
int b;

void setup() { 
  size (800, 600);
  background (0);
}

void draw() {
}

void mousePressed() {
  light = !light;

  int[][] box = new int[cols][rows];
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      box[i][j] = i;
      int a = i*100;
      int b = j*100;


      if (light == true) {
        fill(255);
      } else {
        fill(0);
      }
      rect(a, b, 100, 100);

      println(i, j);
    }
  }
}

1 Ответ

0 голосов
/ 02 ноября 2018

Прежде всего, вы в настоящее время воссоздаете всю доску при каждом нажатии мыши. Вы должны сохранять эту информацию между щелчками мыши, поэтому сделайте box глобальным массивом вместе с другими. Кроме того, достаточно сделать его массивом boolean, если все, что вам нужно, это состояние включения / выключения каждого квадрата:

boolean[][] isSquareLight = new boolean[cols][rows];

Вместо

if (light == true) {

Вы должны просто проверить

if (isSquareLight[i][j] == true) {

(обратите внимание, что == true является избыточным).

Теперь вы уже написали код, который находит координаты для каждого блока: вы передаете его rect!

rect(a, b, 100, 100);

Осталось только проверить, находится ли мышь внутри этого прямоугольника, т. Е. Находится ли mouseX между a и a+100 (и аналогично для mouseY) - если это так, то пользователь щелкните в поле, заданном текущим значением (i, j), так что вы можете просто отменить isSquareLight[i][j] (перед проверкой, как указано выше), и оно будет работать.

Есть способы рассчитать это, не обходя каждый раз всю сетку, но, возможно, вышеприведенное поможет вам найти путь, а не просто получить код, созданный для вас.

PS: int a; int b; в верхней части ничего не делает и может быть удален. Вы используете локальные переменные a и b в своей функции, что правильно.

...