SimpleEngine/include/simpleengine/entity.h

90 lines
2.8 KiB
C
Raw Normal View History

//
// 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 <SFML/Graphics.hpp>
#include <stdexcept>
#include <vcruntime_typeinfo.h>
2020-07-03 20:26:44 +00:00
#include <vector>
#include <memory>
#include <assert.h>
namespace simpleengine {
class Component;
class Game;
class Event;
2020-07-03 20:26:44 +00:00
// @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;
2020-07-03 20:26:44 +00:00
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);
2020-07-03 20:26:44 +00:00
// Called when the entity is about to be destroyed.
// Make sure to implment this in your extending Entity.
2020-07-03 20:26:44 +00:00
virtual void Destroying();
void DestroyLater(); // In most cases, this will be ran next EntityEvent::Update()
const bool& IsGettingDestroyed() const;
template<typename T>
bool HasComponent() const {
for (std::shared_ptr<Component> comp : components) {
if (dynamic_cast<T*>(comp.get())) {
return true;
}
}
return false;
}
template<typename T>
std::shared_ptr<T> GetComponent() const {
for (std::shared_ptr<Component> comp : components) {
if (dynamic_cast<T*>(comp.get())) {
return dynamic_pointer_cast<T>(comp);
}
}
return nullptr;
}
void UpdateComponents(const float& delta_time);
void RenderComponents(sf::RenderTarget* target);
template<typename T>
void AddComponent(std::shared_ptr<T> component) {
static_assert(std::is_base_of_v<Component, T>, "Component class must derive from simpleengine::Component");
// Only allow one type of the same component.
assert(!HasComponent<T>());
components.push_back(component);
}
2020-07-13 03:41:10 +00:00
inline sf::Transformable& GetTransformable() {
return transformable;
}
protected:
sf::Transformable& transformable;
std::vector<std::shared_ptr<Component>> components;
bool destroying = false;
};
}
#endif //GAMEENGINE_ENTITY_H