Внутренние менеджеры ECS

EntityManager

class EntityManager

Менеджер для создания и управления сущностями

Обеспечивает создание, удаление и валидацию сущностей с использованием пула идентификаторов

Public Functions

Entity createEntity()

Создает новую сущность

Использует свободные ID из пула при наличии, иначе генерирует новый

Результат:

Идентификатор созданной сущности

bool destroyEntity(Entity entityId)

Удаляет сущность и освобождает ее ID.

Освобожденный ID помещается в пул для повторного использования

Параметры:

entityId – Идентификатор сущности для удаления

Результат:

true если сущность успешно удалена, false если ID невалиден

bool isEntityValid(Entity entityId) const

Проверяет валидность идентификатора сущности

Параметры:

entityId – Идентификатор сущности для проверки

Результат:

true если сущность существует и валидна, false в противном случае

Private Members

Entity nextEntityId

Следующий доступный идентификатор сущности

std::queue<Entity> freeList

Очередь свободных идентификаторов для повторного использования

ComponentManager

class ComponentManager

Менеджер для управления компонентами сущностей

Обеспечивает хранение, добавление, удаление и поиск компонентов

Public Functions

template<typename T>
inline bool addComponent(Entity entityId, T component)

Добавляет компонент к сущности

Создает копию компонента и связывает его с сущностью

Параметры шаблона:

T – Тип компонента

Параметры:
  • entityId – Идентификатор сущности

  • component – Компонент для добавления

Результат:

true если компонент успешно добавлен, false в противном случае

template<typename T>
inline bool removeComponent(Entity entityId)

Удаляет компонент у сущности

Параметры шаблона:

T – Тип компонента

Параметры:

entityId – Идентификатор сущности

Результат:

true если компонент существовал и был удален, false в противном случае

template<typename T>
inline T *getComponent(Entity entityId)

Получает компонент сущности

Параметры шаблона:

T – Тип компонента

Параметры:

entityId – Идентификатор сущности

Результат:

Указатель на компонент или nullptr если компонент не найден

template<typename T>
inline const std::set<Entity> &getEntitiesWith() const

Получает все сущности, имеющие компонент указанного типа

Параметры шаблона:

T – Тип компонента

Результат:

Константная ссылка на множество сущностей с компонентом

template<typename ...ComponentTypes>
inline std::set<Entity> getEntitiesWithAll() const

Получает все сущности, имеющие все указанные типы компонентов

Выполняет пересечение множеств сущностей для каждого типа компонента

Параметры шаблона:

ComponentTypes – Типы компонентов для поиска

Результат:

Множество сущностей, содержащих все запрошенные компоненты

void removeAllComponents(Entity entityId)

Удаляет все компоненты у сущности

Параметры:

entityId – Идентификатор сущности

Private Functions

template<typename T>
inline ComponentStorage<T> &getComponentStorage()

Получает хранилище для конкретного типа компонента

Параметры шаблона:

T – Тип компонента

Результат:

Ссылка на хранилище компонентов типа T

Private Members

std::unordered_map<std::type_index, std::unique_ptr<IComponentStorage>> componentStorages

Карта хранилищ компонентов по типу

std::unordered_map<std::type_index, std::unique_ptr<std::set<Entity>>> entitiesWithComponentSets

Карта множеств сущностей по типу компонента

template<typename T>
struct ComponentStorage : public prism::scene::ComponentManager::IComponentStorage

Конкретная реализация хранилища для типа компонента

Параметры шаблона:

T – Тип компонента

Public Members

std::unordered_map<Entity, std::shared_ptr<T>> components

Карта сущность -> компонент

struct IComponentStorage

Базовый интерфейс хранилища компонентов

Public Functions

virtual void removeEntity(Entity entityId) = 0

Удаляет все компоненты сущности из хранилища

Параметры:

entityId – Идентификатор сущности

SystemManager

class SystemManager

Менеджер систем для регистрации, включения/выключения и обновления систем.

Управляет коллекцией систем, обновляя их в порядке регистрации.

Public Functions

template<typename T, typename ...Args>
inline SystemId registerSystem(Args&&... args)

Регистрирует новую систему в менеджере.

Создает экземпляр системы и добавляет его в список управления

Параметры шаблона:
  • T – Тип системы (должен быть производным от ISystem).

  • Args – Типы аргументов для конструктора системы.

Параметры:

args – Аргументы для передачи конструктору системы.

Результат:

Идентификатор зарегистрированной системы.

void enableSystem(SystemId systemId)

Включает систему по идентификатору.

Параметры:

systemId – Идентификатор системы, которую нужно включить.

void disableSystem(SystemId systemId)

Выключает систему по идентификатору.

Параметры:

systemId – Идентификатор системы, которую нужно выключить.

void update(float deltaTime)

Обновляет все активные системы

Вызывает update() для всех включенных систем в порядке регистрации

Параметры:

deltaTime – Время, прошедшее с предыдущего обновления

Private Members

std::vector<std::unique_ptr<ISystem>> systems

Массив зарегистрированных систем

Оптимизации

  • Пул сущностей - переиспользование ID

  • Раздельное хранение - компоненты по типам

  • Быстрый поиск - индексация сущностей по компонентам