Нужно ли делать пользовательские события в этой ситуации?
Для хобби я делаю игру. В игре есть монстр, преследующий человека (как Pacman). Когда Пакман застрял, может съесть человека или сделать какое-то движение; событие должно быть возбуждено. Это потому, что моя программа стала неактивной, потому что все объекты должны были знать друг друга, что не принесло сплоченности.
Существует объект, похожий на элемент управления (называемый Game), который должен реагировать на событие; перемещенный человеком, перемещенный монстром, съеденный человеком, застрявший монстром и в конечном счете позволяющий представлению знать, что кое-что случилось, таким образом это перерисовывает. Также важно то, что представление реагирует на нажатия клавиш актера и что эти события должны каким-то образом достигать человека (также с событием).
Может кто-нибудь помочь мне с тем, как я могу лучше всего решить эту проблему? Я искал в Интернете аналогичные проблемы, но не сталкивался ни с одной.
В MVC: контроллер знает вид? Если так: вся программа начинается с контроллера или с представления? (что делает кто)
2 ответа
По сути, механизм обработки событий - это просто шаблон "производитель-потребитель". Представьте, что вы создаете какие-то события (действие), и есть набор слушателей, которых нужно уведомить о вашем действии.
хотите ли вы использовать для использования встроенную обработку событий Java, зависит от того, сколько кода вы уже написали, если рефакторинг кода для использования обработки событий Java требует больших усилий, и у вас ограниченный набор событий, тогда Вы можете написать свою собственную систему передачи сообщений. Но очевидно, что использование механизма обработки событий Java должно быть предпочтительным, так как он заботится об уведомлении всех слушателей, зарегистрированных для этого события, вам не нужно беспокоиться об уведомлении каждого слушателя, и позже это поможет вам в отладке, если что-то пойдет. неправильно. Я надеюсь, что это отвечает на ваш первый вопрос
Короче говоря, вы можете написать свои собственные события, такие как HumanMovedEvent, MonsterMovedEvent и т. Д.
Переходя к вашему второму вопросу, да, в MVC, контроллер знает, какие все представления ему нужно вызвать для какого-либо конкретного действия. Контроллер может выбрать любое конкретное представление для любого конкретного действия, скажем, если вы выполняете какое-то действие A, вы можете вызвать представление V.
и да, ваша программа начинается с отправки запроса из вашего пользовательского интерфейса в контроллер. Контроллер затем выбирает, какое представление необходимо визуализировать для этого конкретного действия.
Надеюсь, я дал понять:)
В MVC контроллер знает как об объекте модели, так и о представлении. Модельный объект не знает, кто его контролирует, и аналогично, представление также не знает этого. Модель и представление обычно связываются с контроллером через обратные вызовы: модель определяет интерфейс для различных методов обратного вызова и имеет переменную экземпляра "делегат", содержащую указатель на этот интерфейс. Контроллер устанавливает себя в качестве делегата на модели. Аналогично для просмотра. Вместо обратных вызовов вы также можете использовать события, как вы предлагаете, что добавило бы дополнительный слой развязки:
- модель может иметь несколько слушателей событий, а не только контроллер
- если контроллер также использует события для связи с моделью, то контроллеру вообще не нужно знать о модели, только о событиях.
Обычно у вас есть одна комбинация модель-вид-контроллер для каждого объекта в вашей программе (одна модель монстра, вид монстра и контроллер монстра). Но у вас также может быть один контроллер, управляющий несколькими объектами модели и / или представлениями. Это зависит от используемой вами структуры пользовательского интерфейса, какой подход наиболее практичен.
Ваш второй вопрос также зависит от используемой вами структуры пользовательского интерфейса. Как правило, контроллер создает представление, но некоторые платформы делают это по-другому.
Для клавиш клавиатуры вы упоминаете: как правило, представление информирует контроллер о нажатой клавише "ctrl-K", и контроллер преобразует это в команды для объекта модели "переместить на 1 пробел вверх".