Khaotic Engine Reborn
Loading...
Searching...
No Matches
entity_manager.h
1#pragma once
2#include "entity.h"
3#include <vector>
4#include <unordered_map>
5#include <queue>
6
7namespace ecs {
8
10public:
11
15 EntityManager() : m_NextEntityID(0) {}
16 ~EntityManager() = default;
17
22 std::shared_ptr<Entity> CreateEntity() {
23 EntityID id;
24
25 // Réutiliser les IDs des entités supprimées si possible
26 if (!m_FreeIDs.empty()) {
27 id = m_FreeIDs.front();
28 m_FreeIDs.pop();
29 } else {
30 id = m_NextEntityID++;
31 }
32
33 auto entity = std::make_shared<Entity>(id);
34 m_Entities[id] = entity;
35
36 return entity;
37 }
38
44 auto it = m_Entities.find(id);
45 if (it != m_Entities.end()) {
46 m_Entities.erase(it);
47 m_FreeIDs.push(id); // Recycler l'ID
48 }
49 }
50
56 std::shared_ptr<Entity> GetEntity(EntityID id) {
57 auto it = m_Entities.find(id);
58 if (it != m_Entities.end()) {
59 return it->second;
60 }
61 return nullptr;
62 }
63
68 void UpdateEntities(float deltaTime) {
69 for (auto& [id, entity] : m_Entities) {
70 entity->UpdateComponents(deltaTime);
71 }
72 }
73
78 std::vector<std::shared_ptr<Entity>> GetAllEntities() {
79 std::vector<std::shared_ptr<Entity>> result;
80 result.reserve(m_Entities.size());
81
82 for (const auto& [id, entity] : m_Entities) {
83 result.push_back(entity);
84 }
85
86 return result;
87 }
88
94 template<typename T>
95 std::vector<std::shared_ptr<Entity>> GetEntitiesWithComponent() {
96 static_assert(std::is_base_of<Component, T>::value, "T must derive from Component");
97
98 std::vector<std::shared_ptr<Entity>> result;
99
100 for (auto& [id, entity] : m_Entities) {
101 if (entity->HasComponent<T>()) {
102 result.push_back(entity);
103 }
104 }
105
106 return result;
107 }
108
113 size_t GetEntityCount() const {
114 return m_Entities.size();
115 }
116
121 void Clear() {
122 m_Entities.clear();
123
124 // Vider la file des IDs libres
125 std::queue<EntityID> empty;
126 std::swap(m_FreeIDs, empty);
127
128 m_NextEntityID = 0;
129 }
130
131private:
132 EntityID m_NextEntityID;
133 std::unordered_map<EntityID, std::shared_ptr<Entity>> m_Entities;
134 std::queue<EntityID> m_FreeIDs; // IDs à réutiliser
135};
136
137} // namespace ecs
std::vector< std::shared_ptr< Entity > > GetEntitiesWithComponent()
void DestroyEntity(EntityID id)
std::shared_ptr< Entity > CreateEntity()
std::shared_ptr< Entity > GetEntity(EntityID id)
void UpdateEntities(float deltaTime)
EntityManager()
Type pour l'ID d'une entité.
std::vector< std::shared_ptr< Entity > > GetAllEntities()
size_t GetEntityCount() const
Definition component.h:9
uint32_t EntityID
Definition entity.h:13