Быстрый вопрос относительно MVC-фреймворка для Java-игры - PullRequest
0 голосов
/ 22 мая 2010

У меня есть вопрос, касающийся использования инфраструктуры MVC для игры в блэкджек, которую я пишу в Java. Как я понимаю, моя модель будет классом, который хранит состояние игры, а точнее, каждую руку игрока. Внутри модельного класса у меня будет массив слушателей, которые будут получать уведомления каждый раз, когда изменяется состояние игры (т. Е. Игрок берет новую карту).

Этими слушателями будет мой зритель, который является классом, который обрабатывает отображение игры. Этот класс будет реализовывать интерфейс ActionListener, и каждый раз, когда модель изменяется, он вызывает / "уведомляет" метод actionPerformed моего зрителя.

Мой вопрос таков: У меня есть два JPanel, каждый из которых посвящен отображению руки соответствующего игрока. Когда игрок берет новую карту, на панель будет добавлен новый ImageIcon. Мой вопрос: как класс зрителя узнает, какая карта была добавлена ​​в руку игрока?

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

Существует ли более эффективный / распространенный способ определения того, что изменилось в модели между состоянием до и после? Другое решение будет перерисовывать всю панель каждый раз, когда происходит уведомление? Это была бы лучшая идея?

Ответы [ 3 ]

1 голос
/ 22 мая 2010

ActionListener скорее посвящен поведению кнопки. В вашем случае использования я предлагаю вам создать свой собственный класс слушателя, который содержит пользовательское событие, содержащее тип события и значения. Как правило, тип события может быть «новая карта», «новая рука», а значения могут быть идентификатором игрока и значением карты.

Для чистой реализации MVC ваши панели должны получать всю необходимую им информацию о событии из объекта события. Чем более он независим от глобального контекста, тем он более пригоден для повторного использования и надежен.

0 голосов
/ 22 мая 2010

Вы можете передать объект события слушателям модели, у которых есть подробная информация о том, что произошло (ADD, REMOVE, REPLACE или сложная CHANGE) и информация о новых и старых значениях. Одним из примеров такого подхода в JDK является javax.swing.event.ListDataEvent, javax.swing.event.ListDataListener и javax.swig.ListModel.

0 голосов
/ 22 мая 2010

Когда игрок берет новую карту, на панель будет добавлен новый ImageIcon. Мой вопрос: как класс зрителя узнает, какая карта была добавлена ​​в руку игрока?

Ну, как правило, у вас может быть интерфейс BlackJackListener, который имеет метод, называемый чем-то вроде notifyNewCard(player, card). (Например, вам не нужно проходить ActionListener, у вас может быть что-то более сложное.)

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

Однако решение, которое я выбрал бы в этом случае, состояло бы в том, чтобы просто перечитать все состояние модели BlackJack, как вы предлагаете выше. Состояние будет действительно простым, поэтому говорить о «влиянии на производительность» не приходится, и вы не рискуете «не синхронизироваться» с моделью.

В таком решении вам нужно всего лишь использовать ChangeListener и сказать: «что-то случилось, обновите ваше мнение обо мне».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...