#pragma once #include #include #include #include #include #include "log.hpp" #include "math.hpp" #include "sprite.hpp" class Entity { public: enum class Type : std::uint8_t { NONE, PLAYER, TILE, COUNT // must be last }; Entity(WorldPos position = {0.0f, 0.0f}); Entity(const Entity &) = delete; Entity &operator=(const Entity &) = delete; Entity(Entity &&) = delete; Entity &operator=(Entity &&) = delete; friend std::ostream &operator<<(std::ostream &os, const Entity &obj); virtual Sprite &GetSprite() = 0; virtual constexpr float GetCollisionRadius() const = 0; virtual constexpr Type GetType() const = 0; virtual bool IsMovable() const = 0; virtual bool IsCollidable() const = 0; virtual void Update(float time_delta); virtual constexpr float GetCollisionRadiusSquared() const { return GetCollisionRadius() * GetCollisionRadius(); } void SetFlagExpired() { m_FlagExpired = true; } bool IsFlaggedExpired() const { return m_FlagExpired; } const WorldPos &GetPosition() const { return m_Position; } void SetPosition(WorldPos new_pos) { m_Position = new_pos; } const WorldPos &GetActualVelocity() const { return m_ActualVelocity; } const WorldPos &GetRequestedVelocity() const { return m_RequestedVelocity; } void SetActualVelocity(const WorldPos &new_velocity) { m_ActualVelocity = new_velocity; } void SetRequestedVelocity(const WorldPos &new_velocity) { m_RequestedVelocity = new_velocity; } void ZeroActualVelocityInDirection(WorldPos direction); protected: WorldPos m_Position; WorldPos m_ActualVelocity; WorldPos m_RequestedVelocity; private: bool m_FlagExpired = false; static constexpr float m_CollisionRadiusSq = 1000.0f; }; class Player final : public Entity { public: Player(); Sprite &GetSprite() override; constexpr Entity::Type GetType() const override { return Entity::Type::PLAYER; } constexpr float GetCollisionRadius() const override { return 50.0f; } bool IsMovable() const override { return true; } bool IsCollidable() const override { return true; } private: void LoadResources(); static std::unique_ptr m_Sprite; };