Khaotic Engine Reborn
Loading...
Searching...
No Matches
entity.h
1#pragma once
2#include "component.h"
3#include <unordered_map>
4#include <vector>
5#include <memory>
6#include <algorithm>
7#include <cassert>
8
9namespace ecs {
13 using EntityID = uint32_t;
14
15class Entity {
16public:
20 explicit Entity(EntityID id) : m_ID(id) {}
21 ~Entity() = default;
22
26 Entity(const Entity&) = delete;
27 Entity& operator=(const Entity&) = delete;
28
32 Entity(Entity&&) = default;
33 Entity& operator=(Entity&&) = default;
34
39 EntityID GetID() const { return m_ID; }
40
48 template<typename T, typename... Args>
49 std::shared_ptr<T> AddComponent(Args&&... args) {
50 static_assert(std::is_base_of<Component, T>::value, "T must derive from Component");
51
53
54 // Vérifier si le composant existe déjà
55 if (m_Components.find(typeID) != m_Components.end()) {
56 return std::static_pointer_cast<T>(m_Components[typeID]);
57 }
58
59 // Créer et ajouter le composant
60 auto component = std::make_shared<T>(std::forward<Args>(args)...);
61 m_Components[typeID] = component;
62
63 // Initialiser le composant
64 component->Initialize();
65
66 return component;
67 }
68
74 template<typename T>
75 std::shared_ptr<T> GetComponent() {
76 static_assert(std::is_base_of<Component, T>::value, "T must derive from Component");
77
79
80 auto it = m_Components.find(typeID);
81 if (it != m_Components.end()) {
82 return std::static_pointer_cast<T>(it->second);
83 }
84
85 return nullptr;
86 }
87
93 template<typename T>
94 bool HasComponent() const {
95 static_assert(std::is_base_of<Component, T>::value, "T must derive from Component");
96
98 return m_Components.find(typeID) != m_Components.end();
99 }
100
105 template<typename T>
107 static_assert(std::is_base_of<Component, T>::value, "T must derive from Component");
108
110 auto it = m_Components.find(typeID);
111
112 if (it != m_Components.end()) {
113 m_Components.erase(it);
114 }
115 }
116
121 void UpdateComponents(float deltaTime) {
122 for (auto& [typeID, component] : m_Components) {
123 component->Update(deltaTime);
124 }
125 }
126
127private:
128
132 EntityID m_ID;
137 std::unordered_map<ComponentTypeID, ComponentPtr> m_Components;
138};
139
140} // namespace ecs
Entity(const Entity &)=delete
std::shared_ptr< T > GetComponent()
Definition entity.h:75
void UpdateComponents(float deltaTime)
Definition entity.h:121
std::shared_ptr< T > AddComponent(Args &&... args)
Definition entity.h:49
bool HasComponent() const
Definition entity.h:94
Entity(Entity &&)=default
void RemoveComponent()
Definition entity.h:106
EntityID GetID() const
Definition entity.h:39
Entity(EntityID id)
Definition entity.h:20
Definition component.h:9
std::type_index ComponentTypeID
Definition component.h:48
ComponentTypeID GetComponentTypeID()
Definition component.h:54
uint32_t EntityID
Definition entity.h:13