// // Created by SeanOMik on 7/2/2020. // Github: https://github.com/SeanOMik // Email: seanomik@gmail.com // #ifndef SIMPLEENGINE_ENTITY_H #define SIMPLEENGINE_ENTITY_H #include #include #include #include #include #include namespace simpleengine { class Component; class Game; class Event; // @TODO Create a Destructible class that replaces Entity::Destroying, Entity::DestroyLater, and Entity::IsGettingDestroyed. class Entity { friend class Game; friend class Event; public: explicit Entity(sf::Transformable& transformable); virtual ~Entity() = default; Entity(const Entity& entity) = delete; virtual void Move(const float& delta_time, const float& dir_x, const float& dir_y); virtual void Move(const float& delta_time, const sf::Vector2f& offset); virtual void Move(const sf::Vector2f& offset); virtual void Render(sf::RenderTarget* target); virtual void Update(const float& delta_time); // Called when the entity is about to be destroyed. // Make sure to implment this in your extending Entity. virtual void Destroying(); void DestroyLater(); // In most cases, this will be ran next EntityEvent::Update() const bool& IsGettingDestroyed() const; template bool HasComponent() const { for (std::shared_ptr comp : components) { if (dynamic_cast(comp.get())) { return true; } } return false; } template std::shared_ptr GetComponent() const { for (std::shared_ptr comp : components) { if (dynamic_cast(comp.get())) { return dynamic_pointer_cast(comp); } } return nullptr; } void UpdateComponents(const float& delta_time); void RenderComponents(sf::RenderTarget* target); template void AddComponent(std::shared_ptr component) { static_assert(std::is_base_of_v, "Component class must derive from simpleengine::Component"); // Only allow one type of the same component. assert(!HasComponent()); components.push_back(component); } inline sf::Transformable& GetTransformable() { return transformable; } protected: sf::Transformable& transformable; std::vector> components; bool destroying = false; }; } #endif //GAMEENGINE_ENTITY_H