Взаимодействие с конкретными элементами в массиве; Обработка 3 - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь создать сетку из квадратов, которые «включаются» при вводе правильной клавиши, а затем «выключаются» при щелчке мышью. В моей программе генерируется случайный номер индекса, который соответствует значению Unicode для конкретной клавиши, и случайный квадрат на сетке окрашивается в зеленый цвет при нажатии этой клавиши. После перекрашивания создается новый индекс для другого ключа и т. Д. Щелчок мышью по последнему цветному квадрату может «снять цвет» (изменить цвет на черный), но не к другим ранее окрашенным квадратам.

Проблема, похоже, заключается в том, что код mousePressed привязан к тому элементу в массиве, который был в последний раз окрашен, но я не могу понять, как заставить его взаимодействовать с любым элементами в массиве которые были окрашены. Это вообще возможно? Я подумал об изменении массива так, чтобы положение каждого элемента в самом массиве было перетасовано, но формы, которые он создает, все еще располагаются в сетке, а затем повторяются в обратном направлении при каждом щелчке мыши. Но я не могу понять, как перетасовать массив, не входя в Java, с которым я не знаком. Это решаемая проблема или я должен как-то настроить свой код? Вот что у меня есть:

Основной скрипт:

int cols = 16;
int rows = 10;
boolean light = false;

Box[][] boxes = new Box[cols][rows];

int keyIndex = int(random(97, 122));
int randI = (int)random(0, cols);
int randJ = (int)random(0, rows);

void setup() {
  size (800, 600);
  background (0);
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      boxes[i][j] = new Box(i, j);
    }
  }
  println(keyIndex);
}


void draw() { 
  if (light == true) {
    boxes[randI][randJ].rollover(mouseX, mouseY);
    boxes[randI][randJ].displayOn();
  } else {
    boxes[randI][randJ].displayOff();
  }
}

void mousePressed() {
  if (boxes[randI][randJ].onPress(mouseX, mouseY)) {
    println("yes");
    light = false;
  } else {
    println("no");
  }
}

void keyPressed() {
  if (boxes[randI][randJ].keyRight()) {
    light = true;
    randI = (int)random(0, cols);
    randJ = (int)random(0, rows);
    keyIndex = int(random(97, 120));
    println(keyIndex);
  }
}

Класс "Ящик":

class Box {

  float x, y;
  color c;
  int size = 50;

  Box (int valX, int valY) {
    x = valX * size;
    y = (int) random(0, valY) * size;
  }

  void displayOn() {
    fill(c);
    rect(x, y, size, size);
    c = #b1f64d;
  }

  void displayOff() {
    fill(c);
    rect(x, y, size, size);
    c = #000000;
  }

  void rollover(float mx, float my) {
    if (mx > x && mx < x + size && my > y && my < y + size) {
      c = 126;
    }
  }

  boolean onPress(float mx, float my) {
    if (mx > x && mx < x + size && my > y && my < y + size) {
      return true;
    } else {
      return false;
    }
  }

  boolean keyRight() {
    if (key == keyIndex) {
      return true;
    } else {
      return false;
    }
  }
}

1 Ответ

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

Вместо единственной переменной boolean light = false; вам нужна переменная-член класса Box:

<s>boolean light = false;</s>

class Box {

    boolean light = false;
    float x, y;
    color c;
    int size = 50;

    Box (int valX, int valY) {
        x = valX * size;
        y = valY * size;
    }

    .....
}

Теперь каждый объект-бокс может содержать информацию, независимо от того, «освещен» он или нет.

В функции draw вы должны нарисовать все поля, каждый из которых зависит от своего состояния
boxes[i][j].light используйте для этого 2 вложенных for цикла:

void draw() { 

    for (int i = 0; i < cols; i++) {
        for (int j = 0; j < rows; j++) {

            if (boxes[i][j].light == true) {
                 boxes[i][j].rollover(mouseX, mouseY);
                 boxes[i][j].displayOn();
            } else {
                 boxes[i][j].displayOff();
            }
        }
    }
}

В mousePressed необходимо проверить все Box объекты с состоянием boxes[i][j].light, включены ли mouseX и mouseY:

void mousePressed() {
    boolean hit = false;
    for (int i = 0; i < cols; i++) {
      for (int j = 0; j < rows; j++) {

        if (boxes[i][j].light == true && boxes[i][j].onPress(mouseX, mouseY)) {
            boxes[i][j].light = false;
            hit = true;
        }
      }
    }
    println(hit ? "yes" : "no");
} 

Наконец, вы должны установить член boxes[randI][randJ].light в функции keyPressed вместо переменной light, которая больше не существует:

void keyPressed() {
    if (boxes[randI][randJ].keyRight()) {
        boxes[randI][randJ].light = true;
        randI = (int)random(0, cols);
        randJ = (int)random(0, rows);
        keyIndex = int(random(97, 120));
        println(keyIndex, char(keyIndex));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...