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