Возникли проблемы с updatePixels () в приложении Java, использующем библиотеки обработки

#java #processing

#java #обработка

Вопрос:

Я пытаюсь написать простую игру на Java, которая использует обработку для рендеринга графики. Однако у меня возникли проблемы с отображением любых изменений с помощью updatePixels (). Я могу успешно установить цвет фона и нарисовать базовые 2d-фигуры, но я ничего не получаю от редактирования переменной pixels [] или от использования set (x, y, color).

Это мой (сокращенный) код:

 import processing.core.*;

public class GameController extends PApplet {
  private int width, height;

  private final static String RENDER_MODE = PConstants.P2D; //JAVA2D;

  public GameController(int width, int height) {
    this.width = width;
    this.height = height - this.getBounds().y;
  }

  @Override
  public void setup() {
    this.size(this.width, this.height, RENDER_MODE);
    this.background(0);
  }

  @Override
  public void draw() {
    this.ellipse(50, 50, 100, 10);

    this.loadPixels();
    for (int p : this.pixels) {
      p = this.color(255, 0, 0);
    }
    this.updatePixels();
  }
}
  

Когда я инициализирую () этот класс, я получаю белый эллипс на черном экране, а не экран с красными пикселями (чего я и ожидал).
Массив pixels [] определенно присутствует, поскольку я распечатал его, и я не получаю ошибок.
Что я делаю не так?

Ответ №1:

Эта строка:

 p = this.color(255, 0, 0);
  

изменяет только локальную переменную p , которая содержала копию значения пикселя.

Что вы хотите, так это изменить значения внутри pixels массива, как в:

 for (int i = 0 ; i < pixels.length ; i  ) {
    pixels[i] = color(255, 0, 0);
}
  

Комментарии:

1. На самом деле написанный вами код эквивалентен функции Java for-each. Я думаю, что проблема заключается в чем-то более тонком, чем это. Я также пытался изменять отдельные пиксели по индексу, но безрезультатно.

2. @Fecal Brunch: нет, это не эквивалентно, p — это не ссылка на пиксель, это значение int. Попробуйте данный код.

3. @PhiLho Спасибо, что посмотрели. Я попробовал это, на всякий случай, и это не сработало. Я также пробовал такие вещи, как «пиксели [5] = цвет (255, 0, 0)», чтобы изменить отдельных пользователей. Я совершенно уверен, что это не имеет ничего общего с циклом. Что касается того, почему for-each эквивалентно, обратите внимание, что «pixels[]» на самом деле является массивом int, пиксели которого хранятся в виде шестнадцатеричных значений RGB. ie. «PApplet.color(255, 0, 0)» вернет «0xFF000000» (последние два нуля являются альфа-каналом). Просто для пояснения эквивалентности для каждого: leepoint.net/notes-java/flow/loops/foreach.html

4. Ах, я только что попробовал это снова, и теперь это работает. Потрясающе. Но почему для каждого не сработало?

5. Хм, хорошо, это было правильно, но когда я изменил его, ничего не произошло. Проблема, с которой я столкнулся, на самом деле была где-то в другом месте кода. Глупый я. Спасибо, ребята.