Я предполагаю, что этот вопрос или варианты его передаются много, поэтому, если я говорю, это дубликат, и ответы лежат в другом месте, пожалуйста, сообщите мне.Обработка событий в конструкторе игрового движка на основе компонентов
Я изучал дизайн игрового движка и столкнулся с моделью на основе компонентов. Это звучит многообещающе, но я все еще разрабатываю его реализацию.
Я рассматриваю систему, в которой двигатель устроен из нескольких «подсистем», которые управляют некоторыми аспектами, такими как рендеринг, звук, здоровье, AI и т. Д. Каждая подсистема имеет связанный с ней тип компонента, например, здоровье компонент для подсистемы здравоохранения. «Сущность», например, NPC, дверь, некоторый визуальный эффект или игрок, просто состоит из одного или нескольких компонентов, которые вместе дают сущности ее функциональность.
Я выделил четыре основных канала передачи информации: компонент может транслировать все компоненты в его текущем объекте, компонент может транслировать его подсистему, подсистема может транслировать ее компоненты, а подсистема может транслироваться в другие подсистемы.
Например, если пользователь хотел переместить свои символы, они нажмут клавишу. Это нажатие клавиши будет подхвачено входной подсистемой, которая затем транслирует событие и будет подхвачена подсистемой проигрывателя. Подсистема плеера затем отправляет это событие всем компонентам проигрывателя (и, следовательно, составляющим эти компоненты), и эти компоненты проигрывателя будут сообщать компоненту позиции своего лица, чтобы двигаться вперед и двигаться.
Все это для ключевого нажатия кажется немного обмотанным, и я, безусловно, открыт для улучшения этой архитектуры. Но во всяком случае, мой основной вопрос все еще следует.
Что касается самих событий, я рассмотрел, где происходит событие, как в шаблоне посетителя. Важность того, что я хочу, состоит в том, что если событие встречается с компонентом, который он не поддерживает (поскольку в событии перемещения нет ничего непосредственного отношения к ИИ или здоровью), он игнорирует компонент. Если событие не находит компонент, который он выполняет, это не имеет значения.
Картина посетителя почти работает. Однако для этого требуется, чтобы у меня были виртуальные функции для каждого типа компонентов (например, visitHealthComponent, visitPositionComponent и т. Д.), Даже если это не имеет к ним никакого отношения. Я мог бы оставить эти функции пустыми (так что, если бы они натолкнулись на эти компоненты, это было бы проигнорировано), но я должен был бы добавить другую функцию каждый раз, когда добавляю компонент.
Мои надежды состояли в том, что я мог бы добавить компонент, не добавляя лишние вещи в другие места, и добавить событие, не вмешиваясь в другие вещи.
Итак, мои два вопроса:
- Существуют ли какие-либо улучшения мой дизайн может позволить, с точки зрения эффективности, гибкости и т.д.?
- Каким будет оптимальный способ обработки событий?