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