как представлять данные о событиях в управляемой событиями коммуникации?

StackOverflow https://stackoverflow.com//questions/11678923

Вопрос

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

У меня будет EventManager, который регистрирует классы прослушивателей для разных типов событий, определенных в статическом перечислении, например Event_Input_KeyPressed или Event_Game_ActorMoved.Он будет хранить события в очереди и отправлять их соответствующим слушателям, каждый из которых будет иметь метод handleEvent(Event e) или что-то в этом роде.

Каждое событие будет объектом типа Event, который содержит данные, такие как тип события.

У меня вопрос: поскольку природа данных о событиях значительно различается в зависимости от типа событий, как следует представлять эти данные?Я еще не уверен, какие именно типы событий я захочу создавать в будущем, поэтому хочу, чтобы это было максимально гибко.Например, событие может вызвать другие события, если выполняются определенные условия (т.когда игрок нажимает клавишу действия, дверь открывается, если игрок находится в определенном месте и у него есть ключ).XML или сценарии — хороший выбор?Я могу придумать еще один способ — создать собственный класс для каждого общего события, например ActorEvent или MenuEvent, но это кажется действительно неэффективным и негибким.Кроме того, поскольку некоторым объектам, таким как «Символ», необходимо знать только очень специфические события, например, нажатие клавиши «w», я полагаю, что им не нужно уведомлять, когда нажимаются другие клавиши, такие как «h».Целесообразно ли создавать конкретные типы событий или есть лучший способ?то есть.Event_Input_KeyPressed_W

Спасибо

Это было полезно?

Решение

  1. Создавайте конкретные реализации ваших мероприятий, начиная с Event базовый объект.Во-первых, будет проще распределять объекты - то есть в вашей очереди, нужно будет только сделать instanceof определить, как обращаться с объектом.
  2. Ваш код прослушивателя событий становится НАМНОГО проще и более строго контролируемым.Нет никаких шансов, что событие мыши перейдет в ключевое событие.Кроме того, вам не нужно будет тестировать и приводить объект события на уровне прослушивателя.
  3. Я не понимаю, почему вы не можете создать «отфильтрованный» прослушиватель событий, который хочет получать уведомления только о конкретном состоянии конкретного события, на самом деле, я думаю, что это отличная идея.
  4. Я бы, наверное, разработал какой-нибудь подключаемый механизм диспетчеризации.Это означает, что когда вы добавляете новый тип события, вам не нужно обновлять очередь, вы можете просто зарегистрировать новый диспетчер.В зависимости от того, чего вы хотите достичь, ваша очередь будет передавать событие диспетчеру (предоставляя диспетчеру некоторые средства для получения списка прослушивателей).Диспетчер определит, знает ли он, как обработать событие или нет.Затем диспетчер отправит событие требуемым слушателям (и в зависимости от того, чего вы хотите достичь), вернет результат, сообщающий, было ли событие отправлено или нет.

это МХО

Другие советы

    .
  • Как вы говорите, структура различных типов событий отличается, лучше создавать бетонные классы для каждого события.Вам не нужно создавать класс для каждого ключа!Но вообще соревнования клавиатуры
  • Вы говорите, что символы должны быть уведомлены только о конкретных ключах.Я не знаю, что такое накладные расходы уведомления о характере и позвольте этому объекту игнорировать неродные ключи, но если это общий рисунок среди классов, например, у вас есть 10 различных классов, которые могут реагировать на специальный набор ключей, было бы неплохоНе повторять коды и внедрять диспетчерский слой между событиями и слушателями.Один вид Disptachers может быть keyfilterdispatcher, который получает список ключей и фильтров событий на основе этого.Другими видами диспетчеров могут быть SEQDispatcher, который только беспокоит слушателей, если несколько событий рассматриваются в определенном порядке! Мне нравятся подключаемые Disptacher Idea MadProrammer, сказал.Также вы можете захотеть создавать трубы диспетчеров тоже!
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top