// // 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 "destructable.h" #include #include #include #include #include #include namespace simpleengine { class Component; class Game; class Event; class Entity : public simpleengine::Destructable { 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); template bool HasComponent() const { for (std::shared_ptr comp : components) { if (std::dynamic_pointer_cast(comp)) { return true; } } return false; } template std::shared_ptr GetComponent() const { for (std::shared_ptr comp : components) { if (std::shared_ptr dyn_comp = std::dynamic_pointer_cast(comp); dyn_comp) { return dyn_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