Добавление элемента в массив массивов с функцией. «Краска» в обработке 3 - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь создать приложение "Paint" с помощью Processing 3 и хочу добавить кнопки для изменения цвета (позже для кистей, размера и т. Д.).

Я застрял, потому чтоЯ продолжаю получать NullPointerException за добавление кнопки в мой массив.

(я знаю, что мог бы просто попросить mouseX и Y после создания каждой кнопки без массива, но это кажется мне немного непрофессиональным и со временем станет очень грязным).

ОШИБКА: строка 24 -> "allButtons [counter] .name = Name;"

* Sidenote: я довольно новичок в обработке / Java xd

Этомой код:

class button
{
  public String name; 
  public int x;
  public int y;
  public color curColor;
};

color currentColor = color(0, 0, 0);
String currentBrush = "Brush";
int currentBrushSize = 3;
button[] allButtons = new button[100];
int buttonSize = 20;
int counter = 1;

void setup() {
  size(800, 600);
  background(255);
  surface.setResizable(true);
  surface.setTitle("Not Skribble");
}

    void button(String Name, int X, int Y, color CurColor) {
      allButtons[counter].name = Name;
      allButtons[counter].x = X;
      allButtons[counter].y = Y;
      allButtons[counter].curColor = CurColor;
      counter += 1;
      fill(CurColor);
      rect(X, Y, buttonSize, buttonSize);
      if (overButton(X, Y, X + buttonSize, Y + buttonSize)) {
        fill(0, 0, 0, 80);
        rect(X, Y, buttonSize, buttonSize);
      }
    }

boolean overButton(int minX, int minY, int maxX, int maxY) {
  if (mouseX >= minX && mouseX <= maxX) {
    if (mouseY >= minY && mouseY <= maxY) {
      return true;
    }
  }
  return false;
}

boolean buttonPressed(String name) {
  for (int i = 0; i < allButtons.length; i++) {
    if (name == allButtons[i].name) {
      if (mouseX >= allButtons[i].x && mouseX <= allButtons[i].x + buttonSize) {
        if (mouseY >= allButtons[i].y && mouseY <= allButtons[i].y + buttonSize)         {
          if (mousePressed) {
            return true;
          }
        }
      }
    }
  }
  return false;
}

void setColor(color settingColor) {
  currentColor = settingColor;
}

void setBrush(String settingBrush) {
  currentBrush = settingBrush;
}

void setBrushSize(int settingBrushSize) {
  currentBrushSize = settingBrushSize;
}

void colorButtons() {
  button("Orange", 10, 10, color(255, 100, 0));
  if (buttonPressed("Orange")) setColor(color(255, 100, 0));

  button("Blue", 50, 10, color(255, 100, 0));
  if (buttonPressed("Blue")) setColor(color(0, 0, 255));
}
void brushButtons(){

}
void settingButtons(){

}

void draw() {
  noStroke();
  fill(100);
  rect(0, 0, width, 70);

  colorButtons();
  brushButtons();
  settingButtons();
}

1 Ответ

0 голосов
/ 23 июня 2018

Когда вы создаете массив следующим образом:

Button[] allButtons = new Button[100];

Вы создаете массив, который может содержать 100 Button экземпляров.Но этот массив начинается как пустой.Попробуйте сделать что-то вроде этого:

println(allButtons[0]);

Вы увидите, что это выводит null, что означает, что значение в основном пустое.Вы на самом деле не добавили экземпляров Button в ваш массив.Вот почему вы получаете сообщение об ошибке: потому что вы пытаетесь использовать несуществующие значения.

Чтобы добавить экземпляр в ваш массив, вы должны сделать что-то вроде этого:

allButtons[0] = new Button();

В этот момент было бы безопасно использовать это значение:

allButtons[0].name = "cancel";

Кстати, вы можете рассмотреть возможность использования ArrayList вместо массива.Или воспользуйтесь функциями массива Processing, которые позволяют добавлять элементы в массив вместо создания массива размером 100.

Кроме того, в будущем, пожалуйста, попробуйте использовать надлежащие соглашения об именах.Переменные должны начинаться с буквы нижнего регистра, а классы должны начинаться с буквы верхнего регистра.Это делает ваш код намного проще для чтения.

...