Теперь, прежде чем я начну, я хочу сказать, что я знаю, что не существует стандартного способа внедрения ECS. Тем не менее, есть один метод, который меня интересует, но он запутался в одной конкретной вещи.
Скажем, у вас есть сущность с TransformComponent (содержит позицию) и RenderComponent (содержит спрайт), и вместе с этим у вас есть RenderSystem, отдельная от сущности.
RenderSystem будет обрабатывать рендеринг всех компонентов с помощью RenderComponent и не будет заботиться о том, к какому объекту она присоединена. Но поскольку Sprite требует позиции, RenderSystem также потребуется TransformComponent.
Теперь начинается часть, в которой я запутался: если все компоненты хранятся в своем собственном векторе этого типа компонента, как я получу все сущности, которые имеют как TransformComponent, так и RenderComponent? Я не хочу использовать наивный метод циклического прохождения всех сущностей в каждой системе, извлекая сущности, которые имеют оба этих компонента, а имеют каждый компонент в векторе типа компонента.
Кроме того, как системы узнали бы, что 2 компонента принадлежат одной и той же сущности? Будет ли к компонентам прикреплен EntityID?
Изменить: я только что понял, что если RenderSystem проходит через все RenderComponents и получает сущность, а затем проверяет, содержит ли эта сущность также TransformComponent, то он может визуализировать его. Но это как бы разрушает целое «Системы не заботятся о сущности», это также требует, чтобы у компонента был EntityID, который я до сих пор не уверен, должен ли он иметь. Кто-то, пожалуйста, уточните все это для меня.
Эта часть называется Entity Handler и требует много работы.
Самая простая форма, которую я знаю, это что-то вроде этого:
Переместите все Компоненты в один большой массив (кеш — King).
Вам понадобится перечисление для каждого компонента:
enum E_Component {
Velocity,
Position,
...
};
И теперь ваша сущность — это просто индекс и массив индекса компонента.
struct Entity {
unsigned index;
unsigned components[NB_COMPONENTS]; // -1 if nothing
};
Поэтому, если Системе необходимо обновить компонент скорости, все, что вам нужно сделать, — это пройтись по вашим сущностям, проверить, есть ли компонент скорости, и обновить его.
==> Система не заботится о сущностях, только о компонентах.
Существует намного лучший способ сделать это, взгляните на это статья
Других решений пока нет …