pathfinding_demo/cpp/src/entities.hpp
2025-09-27 13:49:17 +02:00

86 lines
2.2 KiB
C++

#pragma once
#include <array>
#include <cstdint>
#include <iostream>
#include <memory>
#include <string_view>
#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<Sprite> m_Sprite;
};