JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
World.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Valentin Eloy
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <memory>
7#include <typeindex>
8#include <unordered_map>
9#include <vector>
10
13#include "Core/Ecs/Entity.h"
15#include "Core/Ecs/ISystem.h"
16#include "Core/Ecs/View.h"
17
22
23namespace core {
24
35class World {
36public:
41 [[nodiscard]] Entity createEntity();
42
47 void destroyEntity(Entity entity);
48
54 [[nodiscard]] bool isAlive(Entity entity) const;
55
62 template <typename T>
63 void addComponent(Entity entity, const T& component) {
64 JADG_ASSERT(isAlive(entity), "Ajout d'un composant sur une entite morte.");
65 poolFor<T>().add(entity, component);
66 }
67
74 template <typename T>
75 [[nodiscard]] bool hasComponent(Entity entity) const {
76 const ComponentPool<T>* pool = findPool<T>();
77 return pool != nullptr && pool->has(entity);
78 }
79
87 template <typename T>
88 [[nodiscard]] T& getComponent(Entity entity) {
89 JADG_ASSERT(hasComponent<T>(entity), "L'entite ne possede pas ce composant.");
90 return poolFor<T>().get(entity);
91 }
92
99 template <typename T>
100 void removeComponent(Entity entity) {
101 JADG_ASSERT(hasComponent<T>(entity), "L'entite ne possede pas ce composant.");
102 poolFor<T>().remove(entity);
103 }
104
110 template <typename... Components>
111 [[nodiscard]] View<Components...> view() {
112 return View<Components...>(poolFor<Components>()...);
113 }
114
119 void addSystem(std::unique_ptr<ISystem> system);
120
125 void update(float fixedDelta);
126
128 [[nodiscard]] std::size_t systemCount() const;
129
130private:
136 template <typename T>
138 const std::type_index key(typeid(T));
139 auto iterator = _pools.find(key);
140 if (iterator == _pools.end()) {
141 iterator = _pools.emplace(key, std::make_unique<ComponentPool<T>>()).first;
142 }
143 return *static_cast<ComponentPool<T>*>(iterator->second.get());
144 }
145
151 template <typename T>
152 const ComponentPool<T>* findPool() const {
153 const auto iterator = _pools.find(std::type_index(typeid(T)));
154 if (iterator == _pools.end()) {
155 return nullptr;
156 }
157 return static_cast<const ComponentPool<T>*>(iterator->second.get());
158 }
159
163 std::unordered_map<std::type_index, std::unique_ptr<IComponentPool>> _pools;
165 std::vector<std::unique_ptr<ISystem>> _systems;
166};
167
168} // namespace core
Assertions du projet : vérifient préconditions et invariants (bugs).
#define JADG_ASSERT(condition, message)
Vérifie une précondition.
Definition Assert.h:47
Stockage typé des composants d'un ECS sous forme de sparse set.
Gestionnaire du cycle de vie des entités (création, destruction, recyclage).
Identifiant d'entité de l'ECS : handle générationnel (index + génération).
Interface d'un système de l'ECS : logique exécutée au pas de temps fixe.
Vue multi-composants : itère les entités possédant un ensemble de types.
Stockage dense des composants d'un type T, indexé par entité (sparse set).
Definition ComponentPool.h:61
bool has(Entity entity) const
Indique si une entité possède un composant de ce type.
Definition ComponentPool.h:122
Crée, détruit et valide les entités de l'ECS.
Definition EntityManager.h:30
Sélection en lecture-écriture des entités possédant tous les composants demandés.
Definition View.h:47
Point d'entrée unique de la simulation : possède les entités, les composants et les systèmes.
Definition World.h:35
bool isAlive(Entity entity) const
Indique si une entité est vivante.
Definition World.cpp:36
void addSystem(std::unique_ptr< ISystem > system)
Enregistre un système ; l'ordre d'enregistrement fixe l'ordre d'exécution.
Definition World.cpp:41
EntityManager _entities
Cycle de vie des entités.
Definition World.h:161
void destroyEntity(Entity entity)
Détruit une entité et retire ses composants de toutes les pools.
Definition World.cpp:20
ComponentPool< T > & poolFor()
Récupère la pool du type T, en la créant à la première demande.
Definition World.h:137
std::vector< std::unique_ptr< ISystem > > _systems
Systèmes enregistrés, exécutés dans l'ordre d'insertion.
Definition World.h:165
View< Components... > view()
Construit une vue sur les entités possédant tous les composants demandés.
Definition World.h:111
std::unordered_map< std::type_index, std::unique_ptr< IComponentPool > > _pools
Pools de composants, une par type (clé = type du composant).
Definition World.h:163
const ComponentPool< T > * findPool() const
Récupère la pool du type T sans la créer.
Definition World.h:152
bool hasComponent(Entity entity) const
Indique si une entité possède un composant d'un type donné.
Definition World.h:75
void addComponent(Entity entity, const T &component)
Attache un composant à une entité.
Definition World.h:63
void update(float fixedDelta)
Exécute tous les systèmes enregistrés, dans l'ordre, pour un pas fixe.
Definition World.cpp:47
Entity createEntity()
Crée une nouvelle entité vivante.
Definition World.cpp:15
void removeComponent(Entity entity)
Retire le composant d'un type donné d'une entité.
Definition World.h:100
T & getComponent(Entity entity)
Accède au composant d'une entité (lecture-écriture).
Definition World.h:88
std::size_t systemCount() const
Definition World.cpp:56
Espace de noms du moteur et de la logique de jeu.
Definition Bootstrap.h:9
Handle générationnel identifiant une entité de l'ECS.
Definition Entity.h:24