From 7fb357e9c8ac270d6f48bd6bd46c16c31813eb82 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Mon, 22 Nov 2021 19:15:32 +0100 Subject: [PATCH] feat: add working shapes --- include/game/Mobs.h | 25 ++++++++++++++----------- include/game/Towers.h | 7 ++++--- include/misc/Shapes.h | 11 +++++++++++ src/game/World.cpp | 10 +++++----- src/render/loader/WorldLoader.cpp | 16 ++++++++-------- 5 files changed, 42 insertions(+), 27 deletions(-) diff --git a/include/game/Mobs.h b/include/game/Mobs.h index 5b28faf..a9dea6b 100644 --- a/include/game/Mobs.h +++ b/include/game/Mobs.h @@ -126,7 +126,10 @@ public: Direction getDirection() const { return m_Direction; } void setDirection(Direction dir) { m_Direction = dir; } protected: - void initHealth() { m_Health = static_cast(getStats()->getMaxLife()); } + void initMob() { + m_Health = static_cast(getStats()->getMaxLife()); + setSize(getStats()->getSize().x, getStats()->getSize().y); + } private: void updateEffects(std::uint64_t delta); EffectDuration& getEffect(EffectType type); @@ -136,70 +139,70 @@ typedef std::shared_ptr MobPtr; class Zombie : public Mob { public: - Zombie(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Zombie(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Zombie; } }; class Spider : public Mob { public: - Spider(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Spider(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Spider; } }; class Skeleton : public Mob { public: - Skeleton(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Skeleton(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Skeleton; } }; class PigMan : public Mob { public: - PigMan(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + PigMan(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Pigman; } }; class Creeper : public Mob { public: - Creeper(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Creeper(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Creeper; } }; class Silverfish : public Mob { public: - Silverfish(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Silverfish(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Silverfish; } }; class Blaze : public Mob { public: - Blaze(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Blaze(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Blaze; } }; class Witch : public Mob { public: - Witch(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Witch(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Witch; } }; class Slime : public Mob { public: - Slime(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Slime(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Slime; } }; class Giant : public Mob { public: - Giant(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initHealth(); } + Giant(MobID id, std::uint8_t level, PlayerID sender) : Mob(id, level, sender) { initMob(); } virtual MobType getType() const { return MobType::Giant; } }; diff --git a/include/game/Towers.h b/include/game/Towers.h index 9bcc3f4..a1623d1 100644 --- a/include/game/Towers.h +++ b/include/game/Towers.h @@ -87,7 +87,7 @@ const TowerStats* getTowerStats(TowerType type, TowerLevel level); typedef std::uint16_t TowerID; -class Tower : public utils::shape::Point { +class Tower : public utils::shape::Circle { private: TowerID m_ID; TowerType m_Type; @@ -96,9 +96,9 @@ private: protected: utils::CooldownTimer m_Timer; public: - Tower(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder) : utils::shape::Point(x, y), m_ID(id), m_Type(type), m_Builder(builder), + Tower(TowerID id, TowerType type, std::int32_t x, std::int32_t y, PlayerID builder) : utils::shape::Circle(x + 0.5f, y + 0.5f, 0), m_ID(id), m_Type(type), m_Builder(builder), m_Timer(getStats()->getDamageRate() * 1000) { // converting seconds to millis - + setRadius(getStats()->getRange()); } virtual TowerType getType() const = 0; @@ -110,6 +110,7 @@ public: m_Level.setPath(path); m_Timer.setCooldown(getStats()->getDamageRate() * 1000); // converting seconds to millis m_Timer.reset(); + setRadius(getStats()->getRange()); } std::uint16_t getID() const { return m_ID; } diff --git a/include/misc/Shapes.h b/include/misc/Shapes.h index fcdafdb..92aeee3 100644 --- a/include/misc/Shapes.h +++ b/include/misc/Shapes.h @@ -46,6 +46,7 @@ public: void setCenterX(float x) { m_Center.setX(x); } void setCenterY(float y) { m_Center.setY(y); } + void setSize(float width, float height) { setWidth(width); setHeight(height); } void setWidth(float width) { m_Width = width; } void setHeight(float height) { m_Height = height; } @@ -59,11 +60,21 @@ private: Point m_Center; float m_Radius; public: + Circle(float x, float y, float radius) : m_Center(x, y), m_Radius(radius) {} Circle() : m_Radius(0) {} const Point& getCenter() const { return m_Center; } + float getCenterX() const { return m_Center.getX(); } + float getCenterY() const { return m_Center.getY(); } + float getRadius() const { return m_Radius; } + void setCenter(const Point& center) { m_Center = center; } + void setCenterX(float x) { m_Center.setX(x); } + void setCenterY(float y) { m_Center.setY(y); } + + void setRadius(float radius) { m_Radius = radius; } + bool collidesWith(const Point& point) const; bool collidesWith(const Rectangle& rect) const; bool collidesWith(const Circle& circle) const; diff --git a/src/game/World.cpp b/src/game/World.cpp index cf0999e..f0034ec 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -265,13 +265,13 @@ void World::cleanDeadMobs() { TowerPtr World::getTower(const glm::vec2& position) const { for (TowerPtr tower : m_Towers) { if (tower->getSize() == TowerSize::Big) { - if (tower->getX() - 2 <= static_cast(position.x) && tower->getX() + 2 >= static_cast(position.x) && - tower->getY() - 2 <= static_cast(position.y) && tower->getY() + 2 >= static_cast(position.y)) { + if (tower->getCenterX() - 2.5f < position.x && tower->getCenterX() + 2.5f > position.x && + tower->getCenterY() - 2.5f < position.y && tower->getCenterY() + 2.5f > position.y) { return tower; } - } else { - if (tower->getX() - 1 <= static_cast(position.x) && tower->getX() + 1 >= static_cast(position.x) && - tower->getY() - 1 <= static_cast(position.y) && tower->getY() + 1 >= static_cast(position.y)) { + } else { // little tower + if (tower->getCenterX() - 1.5f < position.x && tower->getCenterX() + 1.5f > position.x && + tower->getCenterY() - 1.5f < position.y && tower->getCenterY() + 1.5f > position.y) { return tower; } } diff --git a/src/render/loader/WorldLoader.cpp b/src/render/loader/WorldLoader.cpp index bdf09c3..b847c5d 100644 --- a/src/render/loader/WorldLoader.cpp +++ b/src/render/loader/WorldLoader.cpp @@ -203,17 +203,17 @@ RenderData loadTowerModel(game::TowerPtr tower) { float towerY, towerDY; if (tower->getSize() == game::TowerSize::Little) { - towerX = tower->getX() - 1; - towerDX = tower->getX() + 2; + towerX = tower->getCenterX() - 1.5f; + towerDX = tower->getCenterX() + 1.5f; - towerY = tower->getY() - 1; - towerDY = tower->getY() + 2; + towerY = tower->getCenterY() - 1.5f; + towerDY = tower->getCenterY() + 1.5f; } else { - towerX = tower->getX() - 2; - towerDX = tower->getX() + 3; + towerX = tower->getCenterX() - 2.5f; + towerDX = tower->getCenterX() + 2.5f; - towerY = tower->getY() - 2; - towerDY = tower->getY() + 3; + towerY = tower->getCenterY() - 2.5f; + towerDY = tower->getCenterY() + 2.5f; } std::vector positions = { towerX, towerY,