Нужно ли делать пользовательские события в этой ситуации? - PullRequest
1 голос
/ 22 декабря 2011

Для хобби я делаю игру. В игре есть монстр, преследующий человека (как Pacman). Когда Пакман застрял, может съесть человека или сделать какое-то движение; событие должно быть поднято. Это потому, что моя программа перестала работать, потому что все объекты должны были знать друг друга, что не принесло сплоченности.

Существует объект, похожий на элемент управления (называемый Game), который должен реагировать на событие; перемещенный человеком, перемещенный монстром, съеденный человеком, застрявший монстром и в конечном счете позволяющий представлению знать, что кое-что случилось, таким образом, это перерисовывает. Также важно то, что представление реагирует на нажатия клавиш актера и что эти события должны каким-то образом достигать человека (также с событием).

  1. Может ли кто-нибудь помочь мне с тем, как я могу наилучшим образом решить эту проблему? Я искал в Интернете аналогичные проблемы, но не нашел ни одной.

  2. В MVC: контроллер знает вид? Если так: вся программа начинается с контроллера или с представления? (что делает кто)

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

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

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

Короче говоря, вы можете написать свои собственные события, такие как HumanMovedEvent, MonsterMovedEvent и т. Д.

Возвращаясь к вашему 2-му вопросу, да, в MVC контроллер знает, какие все представления ему нужно инициировать для какого-либо конкретного действия. Контроллер может выбрать любое конкретное представление для любого конкретного действия, скажем, если вы выполняете какое-то действие A, вы можете вызвать представление V.

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

Надеюсь, я дал понять:)

0 голосов
/ 22 декабря 2011

В MVC контроллер знает как об объекте модели, так и о представлении.Модельный объект не знает, кто его контролирует, и аналогично, представление также не знает этого.Модель и представление обычно связываются с контроллером через обратные вызовы: модель определяет интерфейс для различных методов обратного вызова и имеет переменную экземпляра «делегат», содержащую указатель на этот интерфейс.Контроллер устанавливает себя в качестве делегата на модели.Аналогично для просмотра.Вместо обратных вызовов вы также можете использовать события, как вы предлагаете, что добавило бы дополнительный слой развязки:

  • модель может иметь несколько прослушивателей событий, а не только контроллер
  • если контроллер также использует события для связи с моделью, то контроллеру вообще не нужно знать о модели, только о событиях.

Как правило, у вас будет один вид модели -комбинация контроллеров для каждого объекта в вашей программе (одна модель монстра, вид монстра и контроллер монстра).Но у вас также может быть один контроллер, управляющий несколькими объектами модели и / или представлениями.От используемой вами структуры пользовательского интерфейса зависит, какой подход наиболее практичен.

Ваш второй вопрос также зависит от используемой вами структуры пользовательского интерфейса.Как правило, контроллер создает экземпляр представления, но некоторые платформы делают это по-разному.

Для клавиш клавиатуры, о которых вы упоминаете: обычно представление информирует контроллер о нажатой клавише «ctrl-K» и контроллерперевел бы это в команды для объекта модели "переместить 1 пробел вверх".

...