Чтобы лучше изучить 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?
Задача ещё не решена.
Других решений пока нет …