feat: add working shapes

This commit is contained in:
2021-11-22 19:15:32 +01:00
parent 1d7a8cc66b
commit 7fb357e9c8
5 changed files with 42 additions and 27 deletions

View File

@@ -126,7 +126,10 @@ public:
Direction getDirection() const { return m_Direction; } Direction getDirection() const { return m_Direction; }
void setDirection(Direction dir) { m_Direction = dir; } void setDirection(Direction dir) { m_Direction = dir; }
protected: protected:
void initHealth() { m_Health = static_cast<float>(getStats()->getMaxLife()); } void initMob() {
m_Health = static_cast<float>(getStats()->getMaxLife());
setSize(getStats()->getSize().x, getStats()->getSize().y);
}
private: private:
void updateEffects(std::uint64_t delta); void updateEffects(std::uint64_t delta);
EffectDuration& getEffect(EffectType type); EffectDuration& getEffect(EffectType type);
@@ -136,70 +139,70 @@ typedef std::shared_ptr<Mob> MobPtr;
class Zombie : public Mob { class Zombie : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Zombie; }
}; };
class Spider : public Mob { class Spider : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Spider; }
}; };
class Skeleton : public Mob { class Skeleton : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Skeleton; }
}; };
class PigMan : public Mob { class PigMan : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Pigman; }
}; };
class Creeper : public Mob { class Creeper : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Creeper; }
}; };
class Silverfish : public Mob { class Silverfish : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Silverfish; }
}; };
class Blaze : public Mob { class Blaze : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Blaze; }
}; };
class Witch : public Mob { class Witch : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Witch; }
}; };
class Slime : public Mob { class Slime : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Slime; }
}; };
class Giant : public Mob { class Giant : public Mob {
public: 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; } virtual MobType getType() const { return MobType::Giant; }
}; };

View File

@@ -87,7 +87,7 @@ const TowerStats* getTowerStats(TowerType type, TowerLevel level);
typedef std::uint16_t TowerID; typedef std::uint16_t TowerID;
class Tower : public utils::shape::Point { class Tower : public utils::shape::Circle {
private: private:
TowerID m_ID; TowerID m_ID;
TowerType m_Type; TowerType m_Type;
@@ -96,9 +96,9 @@ private:
protected: protected:
utils::CooldownTimer m_Timer; utils::CooldownTimer m_Timer;
public: 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 m_Timer(getStats()->getDamageRate() * 1000) { // converting seconds to millis
setRadius(getStats()->getRange());
} }
virtual TowerType getType() const = 0; virtual TowerType getType() const = 0;
@@ -110,6 +110,7 @@ public:
m_Level.setPath(path); m_Level.setPath(path);
m_Timer.setCooldown(getStats()->getDamageRate() * 1000); // converting seconds to millis m_Timer.setCooldown(getStats()->getDamageRate() * 1000); // converting seconds to millis
m_Timer.reset(); m_Timer.reset();
setRadius(getStats()->getRange());
} }
std::uint16_t getID() const { return m_ID; } std::uint16_t getID() const { return m_ID; }

View File

@@ -46,6 +46,7 @@ public:
void setCenterX(float x) { m_Center.setX(x); } void setCenterX(float x) { m_Center.setX(x); }
void setCenterY(float y) { m_Center.setY(y); } 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 setWidth(float width) { m_Width = width; }
void setHeight(float height) { m_Height = height; } void setHeight(float height) { m_Height = height; }
@@ -59,11 +60,21 @@ private:
Point m_Center; Point m_Center;
float m_Radius; float m_Radius;
public: public:
Circle(float x, float y, float radius) : m_Center(x, y), m_Radius(radius) {}
Circle() : m_Radius(0) {} Circle() : m_Radius(0) {}
const Point& getCenter() const { return m_Center; } 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; } 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 Point& point) const;
bool collidesWith(const Rectangle& rect) const; bool collidesWith(const Rectangle& rect) const;
bool collidesWith(const Circle& circle) const; bool collidesWith(const Circle& circle) const;

View File

@@ -265,13 +265,13 @@ void World::cleanDeadMobs() {
TowerPtr World::getTower(const glm::vec2& position) const { TowerPtr World::getTower(const glm::vec2& position) const {
for (TowerPtr tower : m_Towers) { for (TowerPtr tower : m_Towers) {
if (tower->getSize() == TowerSize::Big) { if (tower->getSize() == TowerSize::Big) {
if (tower->getX() - 2 <= static_cast<std::int32_t>(position.x) && tower->getX() + 2 >= static_cast<std::int32_t>(position.x) && if (tower->getCenterX() - 2.5f < position.x && tower->getCenterX() + 2.5f > position.x &&
tower->getY() - 2 <= static_cast<std::int32_t>(position.y) && tower->getY() + 2 >= static_cast<std::int32_t>(position.y)) { tower->getCenterY() - 2.5f < position.y && tower->getCenterY() + 2.5f > position.y) {
return tower; return tower;
} }
} else { } else { // little tower
if (tower->getX() - 1 <= static_cast<std::int32_t>(position.x) && tower->getX() + 1 >= static_cast<std::int32_t>(position.x) && if (tower->getCenterX() - 1.5f < position.x && tower->getCenterX() + 1.5f > position.x &&
tower->getY() - 1 <= static_cast<std::int32_t>(position.y) && tower->getY() + 1 >= static_cast<std::int32_t>(position.y)) { tower->getCenterY() - 1.5f < position.y && tower->getCenterY() + 1.5f > position.y) {
return tower; return tower;
} }
} }

View File

@@ -203,17 +203,17 @@ RenderData loadTowerModel(game::TowerPtr tower) {
float towerY, towerDY; float towerY, towerDY;
if (tower->getSize() == game::TowerSize::Little) { if (tower->getSize() == game::TowerSize::Little) {
towerX = tower->getX() - 1; towerX = tower->getCenterX() - 1.5f;
towerDX = tower->getX() + 2; towerDX = tower->getCenterX() + 1.5f;
towerY = tower->getY() - 1; towerY = tower->getCenterY() - 1.5f;
towerDY = tower->getY() + 2; towerDY = tower->getCenterY() + 1.5f;
} else { } else {
towerX = tower->getX() - 2; towerX = tower->getCenterX() - 2.5f;
towerDX = tower->getX() + 3; towerDX = tower->getCenterX() + 2.5f;
towerY = tower->getY() - 2; towerY = tower->getCenterY() - 2.5f;
towerDY = tower->getY() + 3; towerDY = tower->getCenterY() + 2.5f;
} }
std::vector<float> positions = { std::vector<float> positions = {
towerX, towerY, towerX, towerY,