У меня есть система рендеринга, которая выполняет итерацию по всем компонентам MeshDrawData и пакетно и рисует их. Моя реализация ECS допускает только один тип компонентов для каждой сущности.
Теперь я хочу изобразить ракетку для понга "Игрок". Мое мышление ООП говорит следующее:
Pseudocode:
auto e = createEntity();
createSpriteComponent(e,...); // this creates a MeshDrawData internally for e entity.
createColliderComponent(e,...);
Это работает нормально, НО, допустим, теперь я тоже хочу отрендерить линию. Если я сделаю это:
Pseudocode:
auto e = createEntity();
createSpriteComponent(e,...); // this creates a MeshDrawData internally for the e entity.
createColliderComponent(e,...);
createLineComponent(e,...); // this creates a MeshDrawData internally for the e entity
Здесь вы можете увидеть проблему .. Я создал два компонента MeshDrawData для объекта e ..
Учитывая мою нереальную предысторию движка, я создаю актера и добавляю к нему компоненты. Я всегда думал, что в ECS сущность похожа на актера, но я вижу, что я совершенно неправ.
Как вы организуете свои сущности, чтобы, например, разрешить варианты использования, подобные упомянутому мною ранее? Что именно должен представлять объект?
Возможные решения:
- Никогда не создавайте объект с SpriteComponent и LineComponent, которые создают одни и те же MeshDrawData в одном и том же объекте .. (очевидно, но подвержено ошибкам)
- Создайте дочернюю сущность для каждого SpriteComponent и / или LineComponent и добавьте их к соответствующему дочернему элементу. Это сработает, но сделает длинные деревья иерархии сущностей ... не уверен, что это более подвержено ошибкам. ...