Как разделить контейнеры между разными классами?

Чтобы лучше изучить C ++, я программирую небольшую игру. Хотя, прежде чем проект станет слишком большим, я бы хотел его реорганизовать.

Действительно, у меня уже есть дюжина уроков, и я чувствую, что организовываю это неправильно.

Например, когда мне нужно написать такие вещи:

(*((*(m_positionComponents))[(*it)])).posX = 0;

Я просто думаю, что есть проблема в структуре моих классов.

Я использую систему Entity Component (ECS) для своей игры, и подведу итог:

я имею xxxComponent классы, которые наследуют Component и ComponentManager который хранит все компоненты в столько карт, сколько разных компонентов. Тогда у меня есть EntityManager который хранит все сущности и компоненты, которые они имеют (используя бинарные маски) и xxxSystem классы, наследуемые от System которые изменяют компоненты при каждом обновлении. Например, когда MovementSystemвызывается функция обновления, она будет перебирать все сущности, которые получили PositionComponent и VelocityComponent и изменить положение в соответствии со скоростью (и, возможно, также изменить скорость).

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

Например, EntityManager содержит ссылку на все системы для их обновления, MovementSystem должен иметь доступ к хранилищу компонентов в ComponentManager а также к сущностям и маскам из EntityManager, ComponentManager нужны векторы сущностей и масок, расположенных в EntityManager

Следовательно, все указатели, хотя есть только один, чтобы получить доступ к компонентам позиции из ComponentManager а другой — потому что я хранил экземпляры компонентов в векторах через указатели.

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

Что, вы парни, думаете? Есть ли лучший способ организовать эту ECS?

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы [email protected]