#pragma once #include #include #include #include "Constants.h" #include "Component.h" #include "SpriteComponent.h" #include "ECS.h" class Manager; //class Component; using ComponentBitSet = std::bitset; using GroupBitSet = std::bitset; using ComponentArray = std::array; class Entity { public: explicit Entity(Manager& mManager) : manager(mManager) { } void update() const; void draw() const; bool isActive() const { return this->active; } void destroy() { this->active = false; } bool hasGroup(Group mGroup); void addGroup(Group mGroup); void delGroup(Group mGroup); template bool hasComponent() const { return componentBitSet[getComponentTypeID()]; } template T& addComponent(TArgs&&...mArgs) { T* c(new T(std::forward(mArgs)...)); c->entity = this; std::unique_ptr uPtr{ c }; this->components.emplace_back(std::move(uPtr)); componentArray[getComponentTypeID()] = c; componentBitSet[getComponentTypeID()] = true; c->init(); return *c; }; template T& getComponent() const { auto ptr(componentArray[getComponentTypeID()]); return *static_cast(ptr); } private: Manager& manager; bool active = true; std::vector> components; ComponentArray componentArray; ComponentBitSet componentBitSet; GroupBitSet groupBitSet; };