динамически создавая сетку прямоугольников - PullRequest
1 голос
/ 21 октября 2011

Я хотел создать Игра жизни Конвея . Я прочитал Java 2d API, но класс Graphics предоставляет только методы для drawRect() и fillRect() для paintComponent JPanel. Я имею в виду, что прямоугольники нельзя обрабатывать индивидуально как объекты, т. Е. Чтобы я мог проверить, какой из них включен по сравнению с ближайшими.
Поэтому я хотел спросить, как сделать квадраты, чтобы они могли обрабатываться индивидуально, а сетка создавалась динамически?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Создайте класс Sqaure со всеми необходимыми свойствами.Создайте список объектов Square, представляющих доску.В методе рисования для JPanel переберите свой список объектов Square, вытягивая каждый из них на основе его свойств.

Держите код отображения отдельно от своей логики, насколько это возможно - это почти всегда хорошоидея.

1 голос
/ 31 октября 2011

Я бы хотел предложить совершенно другое решение.Обычно приходится обрабатывать сгенерированную графику только для вывода, то есть вы не хотите читать состояние из графики, потому что это будет слишком медленно.Вы должны будете сохранить состояние ячеек в другом месте, как в двумерном массиве.логическое [] [] или int [] [] например.Тогда вам понадобится метод «рендеринга», который берет значения ваших ячеек и выводит их.

Но я бы хотел предложить еще более холодный способ сделать это.Вместо хранения двумерного массива используйте (одномерный) массив, из которого состоит BufferedImage.Обычно каждый «пиксель» является элементом в этом массиве.Затем вы используете drawImage, чтобы нарисовать это изображение и увеличить его.Это может работать очень хорошо.Возможно, вам удастся в реальном времени нарисовать весь экран в реальном времени.

Существуют различные методы BufferedImage, поначалу это немного сбивает с толку.В конце концов вы найдете DataBuffer где-нибудь.Вам понадобится доступ к int [].

Затем, чтобы установить ячейку: data [y * width + x] = -1;(белая ячейка), чтобы очистить ячейку: data [y * width + x] = 0;(черная клетка) (например - или наоборот - или любой другой цвет).

Вы можете по-настоящему полюбить это.Вы можете использовать различные переменные смещения вместо того, чтобы постоянно вычислять y * width + x, и действительно оптимизировать его.На самом деле, я зашел настолько далеко, что смог сделать его настолько эффективным, что вы могли бы превзойти другого парня, создавшего точно такую ​​же программу на C ++.

...