#pragma once #include #include #include #include #include "ColliderComponent.h" #include "ECS.h" #include "Constants.h" // TODO: remove here if possible // temporary fix: addComponent function template doesnt know TransformComponent -> error undefined type #include "InputComponent.h" #include "TransformComponent.h" #include "SpriteComponent.h" class Manager; class Component; using ComponentBitSet = std::bitset; using GroupBitSet = std::bitset; using ComponentArray = std::array; class Entity { public: /*! TODO */ enum class GroupLabel { MAPTILES, PLAYERS, ENEMIES, COLLIDERS, PROJECTILE, HEARTS, POWERUPS }; explicit Entity(Manager& mManager) : manager(mManager) { }; void update() const; void draw() const; bool isActive() const { return this->active; } void destroy() { this->active = false; if (this->hasComponent()) { this->getComponent().removeCollision(); } } bool hasGroup(Group mGroup); void addGroup(Group mGroup); void delGroup(Group mGroup); std::bitset getGroupBitSet(); Manager& getManager() { return manager; }; 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; };