Обработка событий в компонентном дизайне игрового движка

Я полагаю, что этот вопрос или его варианты часто распространяются, поэтому, если то, что я говорю, является дубликатом, а ответы лежат в другом месте, пожалуйста, сообщите мне.

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

Я рассматриваю систему, в которой движок состоит из нескольких «подсистем», которые управляют некоторыми аспектами, такими как рендеринг, звук, состояние, AI и т. Д. Каждая подсистема имеет связанный с ней тип компонента, например компонент работоспособности для подсистемы работоспособности. «Сущность», например NPC, дверь, некоторый визуальный эффект или игрок, просто состоит из одного или нескольких компонентов, которые вместе придают сущности ее функциональные возможности.

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

12136] Например, если пользователь хочет переместить своих персонажей, он нажимает клавишу. Это нажатие клавиши будет улавливаться подсистемой ввода, которая затем транслирует событие и будет захвачено подсистемой проигрывателя. Подсистема проигрывателя затем отправляет это событие всем компонентам игрока (и, следовательно, объектам, которые составляют эти компоненты), и эти компоненты игрока будут связываться с компонентом положения своего собственного объекта, чтобы продолжить и двигаться.

Все это похоже на нажатие клавиши. немного запыхался, и я, конечно, открыт для улучшений этой архитектуры. Но все таки, мой главный вопрос все еще следует.

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

Шаблон посетителя почти работает. Однако для этого потребовалось бы, чтобы у меня были виртуальные функции для каждого типа компонента (например, visitHealthComponent, visitPositionComponent и т. Д.), Даже если он не имеет к ним никакого отношения. Я мог бы оставить эти функции пустыми (так что, если бы он обнаружил эти компоненты, это было бы проигнорировано), но мне пришлось бы добавлять другую функцию каждый раз, когда я добавляю компонент.

Я надеялся, что смогу добавить компонент, не обязательно добавляя что-то в другие места, и добавить событие, не вмешиваясь в другие вещи.

Итак, мои два вопроса:

  1. Есть ли какие-нибудь улучшения в моем дизайн может позволить с точки зрения эффективности, гибкости и т. д.?
  2. Какой будет оптимальный способ обработки событий?
10
задан Dave Schweisguth 14 February 2016 в 00:03
поделиться