#pragma once #include "ComponentManager.hpp" #include "EntityManager.hpp" #include "EventManager.hpp" #include "SystemManager.hpp" #include "Types.hpp" #include class Coordinator { public: void Init() { mComponentManager = std::make_unique(); mEntityManager = std::make_unique(); mEventManager = std::make_unique(); mSystemManager = std::make_unique(); } // Entity methods Entity CreateEntity() { return mEntityManager->CreateEntity(); } void DestroyEntity(Entity entity) { mEntityManager->DestroyEntity(entity); mComponentManager->EntityDestroyed(entity); mSystemManager->EntityDestroyed(entity); } // Component methods template void RegisterComponent() { mComponentManager->RegisterComponent(); } template void AddComponent(Entity entity, T component) { mComponentManager->AddComponent(entity, component); auto signature = mEntityManager->GetSignature(entity); signature.set(mComponentManager->GetComponentType(), true); mEntityManager->SetSignature(entity, signature); mSystemManager->EntitySignatureChanged(entity, signature); } template void RemoveComponent(Entity entity) { mComponentManager->RemoveComponent(entity); auto signature = mEntityManager->GetSignature(entity); signature.set(mComponentManager->GetComponentType(), false); mEntityManager->SetSignature(entity, signature); mSystemManager->EntitySignatureChanged(entity, signature); } template T& GetComponent(Entity entity) { return mComponentManager->GetComponent(entity); } template ComponentType GetComponentType() { return mComponentManager->GetComponentType(); } // System methods template std::shared_ptr RegisterSystem() { return mSystemManager->RegisterSystem(); } template void SetSystemSignature(Signature signature) { mSystemManager->SetSignature(signature); } // Event methods void AddEventListener(EventId eventId, std::function const& listener) { mEventManager->AddListener(eventId, listener); } void SendEvent(Event& event) { mEventManager->SendEvent(event); } void SendEvent(EventId eventId) { mEventManager->SendEvent(eventId); } private: std::unique_ptr mComponentManager; std::unique_ptr mEntityManager; std::unique_ptr mEventManager; std::unique_ptr mSystemManager; };