Argentum Online - Cliente
entity.h
1 #ifndef ENTITY_H
2 #define ENTITY_H
3 
4 #include <iostream>
5 #include <memory>
6 #include <unordered_map>
7 
8 #include "../../../include/my_exception.h"
9 #include "component.h"
10 #include "component_util.h"
11 #include "entity_manager.h"
12 
17 class Entity {
18  private:
19  unsigned int id;
20  bool alive;
21  std::unordered_map<ComponentId, std::unique_ptr<Component>> components;
22 
23  public:
24  Entity(unsigned int id);
25  ~Entity();
26 
31  void update();
32 
39  bool is_alive();
40 
45  void kill();
46 
47  template <class T>
48  bool has_component() const {
49  return components.count(ComponentUtil::get_type_id<T>());
50  }
51 
60  template <class T, typename... TArgs>
61  T& add_component(TArgs&&... mArgs) {
62  // Se puede tener una sola vez el componente
63  if (has_component<T>())
64  throw MyException("Entity: already has that component");
65  T* component(new T(std::forward<TArgs>(mArgs)...)); // perfect forward
66  component->set_entity(this);
67  ComponentId c_id = ComponentUtil::get_type_id<T>();
68  components[c_id] = std::unique_ptr<Component>(component);
69  component->init();
70  return *component;
71  }
72 
78  template <class T>
79  void del_component() {
80  // No puedo eliminar un componente que no tengo
81  if (!has_component<T>())
82  throw MyException("Entity: cannot delete an unexistent component");
83  ComponentId c_id = ComponentUtil::get_type_id<T>();
84  components[c_id].reset();
85  components.erase(c_id);
86  }
87 
94  template <class T>
95  T& get_component() const {
96  if (!has_component<T>())
97  throw MyException("Entity: cannot get an unexistent component");
98  ComponentId c_id = ComponentUtil::get_type_id<T>();
99  Component* comp = components.at(c_id).get();
100  return *reinterpret_cast<T*>(comp);
101  }
102 };
103 
104 #endif // ENTITY_H
Entity::update
void update()
Actualiza cada uno de los componentes de la entidad.
Definition: entity.cpp:7
Entity::del_component
void del_component()
Borra una componente de la entidad.
Definition: entity.h:79
Entity::is_alive
bool is_alive()
Indica si la entidad continuara activa luego del ultimo clean.
Definition: entity.cpp:13
Entity::add_component
T & add_component(TArgs &&... mArgs)
Agrega una componente a la entidad.
Definition: entity.h:61
Entity
Entidad (NPCs y personajes)
Definition: entity.h:17
MyException
Definition: my_exception.h:8
Component
Componente agregable a entidades.
Definition: component.h:10
Entity::get_component
T & get_component() const
Devuelve una componente.
Definition: entity.h:95
Entity::kill
void kill()
Indica que la entidad debe ser limpiada en el proximo clean.
Definition: entity.cpp:17