2011-12-21 6 views
1

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

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

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

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

ответ

1

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

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

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

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

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

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

+0

спасибо за часть MVC :-) Это помогло мне, поскольку некоторые люди, которых я знаю, верят, что лучше контролировать контроллер только вместе и не знает представления. Я думал о специальном событии вроде; класс GameEvent расширяет EventObject. С идентификатором, который описывает событие (с использованием таких констант, как GameEvent.EntityMoved, HumanEaten, SnapperStuck и т. Д.). Единственное, что мне еще нужно знать; как может вид (который ловит ключевые события, такие как стрелка), позволяет человеку понять, что он должен двигаться вверх? – zondvloed

+0

Ваша идея создания класса GameEvent и ссылки на каждое событие с использованием констант, таких как ENtityMoved и т. Д., Приятно. как ваш взгляд позволит человеку узнать, может быть достигнуто таким образом. ArrowUpEvent ---> Контроллер прослушивает событие и отправляет на просмотр ----> Просмотр генерации другого события ---> объекты-люди получают событие из представления. –

+0

Итак, вы предлагаете мне иметь другое пользовательское событие под названием MoveHuman (или также сделать его постоянным в GameEvent) и позволить человеку его слушать? Но не все ли тогда склоняются к классу GameEvent (как и в случае, если это хорошо связывает)? спасибо за вашу помощь и время в этом вопросе btw! – zondvloed

0

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

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

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

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

Ключи keyboad, которые вы упоминаете: обычно представление будет информировать контроллер ключа, который нажат «ctrl-K», и контроллер переведет его в команды для объекта модели «перемещение 1 вверх».

+0

Я использую Swing для своего графического интерфейса. Jpanel реализует keylistener. Единственное, что мне трудно найти в моей программе, - это то, как представление позволяет Человеку понять, что он должен двигаться вверх. Это связано с тем, что элемент управления (так называемая игра в моем случае) не имеет прямого соединения с человеком (потому что в игре есть игровое поле, что есть клетки, что может иметь сущность, которая может быть человеком) – zondvloed

+0

В вашем случае, Я предлагаю вам (1) добавить информацию о том, какой объект является человечником для контроллера. Либо это, либо одна из этих альтернатив могла бы сделать: (2) дать Человеку свой собственный контроллер и просмотреть и направить все входные данные клавиатуры на это представление, или (3) позволить объединенному контроллеру преобразовать ввод клавиатуры в специальные события, объект зарегистрирован, чтобы действовать. – fishinear

 Смежные вопросы

  • Нет связанных вопросов^_^