Entity Component System путаница

Теперь, прежде чем я начну, я хочу сказать, что я знаю, что не существует стандартного способа внедрения ECS. Тем не менее, есть один метод, который меня интересует, но он запутался в одной конкретной вещи.

Скажем, у вас есть сущность с TransformComponent (содержит позицию) и RenderComponent (содержит спрайт), и вместе с этим у вас есть RenderSystem, отдельная от сущности.
RenderSystem будет обрабатывать рендеринг всех компонентов с помощью RenderComponent и не будет заботиться о том, к какому объекту она присоединена. Но поскольку Sprite требует позиции, RenderSystem также потребуется TransformComponent.

Теперь начинается часть, в которой я запутался: если все компоненты хранятся в своем собственном векторе этого типа компонента, как я получу все сущности, которые имеют как TransformComponent, так и RenderComponent? Я не хочу использовать наивный метод циклического прохождения всех сущностей в каждой системе, извлекая сущности, которые имеют оба этих компонента, а имеют каждый компонент в векторе типа компонента.
Кроме того, как системы узнали бы, что 2 компонента принадлежат одной и той же сущности? Будет ли к компонентам прикреплен EntityID?

Изменить: я только что понял, что если RenderSystem проходит через все RenderComponents и получает сущность, а затем проверяет, содержит ли эта сущность также TransformComponent, то он может визуализировать его. Но это как бы разрушает целое «Системы не заботятся о сущности», это также требует, чтобы у компонента был EntityID, который я до сих пор не уверен, должен ли он иметь. Кто-то, пожалуйста, уточните все это для меня.

0

Решение

Эта часть называется Entity Handler и требует много работы.

Самая простая форма, которую я знаю, это что-то вроде этого:

Переместите все Компоненты в один большой массив (кеш — King).
Вам понадобится перечисление для каждого компонента:

enum E_Component {

Velocity,
Position,
...
};

И теперь ваша сущность — это просто индекс и массив индекса компонента.

struct Entity {

unsigned index;
unsigned components[NB_COMPONENTS]; // -1 if nothing
};

Поэтому, если Системе необходимо обновить компонент скорости, все, что вам нужно сделать, — это пройтись по вашим сущностям, проверить, есть ли компонент скорости, и обновить его.

==> Система не заботится о сущностях, только о компонентах.


Существует намного лучший способ сделать это, взгляните на это статья

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector