diff --git a/src/Arrow.cpp b/src/Arrow.cpp index f69ace7..93f33b4 100644 --- a/src/Arrow.cpp +++ b/src/Arrow.cpp @@ -8,6 +8,11 @@ Arrow::Arrow(GameRenderer *renderer, const double x, const double y, const doubl sprite = renderer->load_sprite("./assets/arrow.png", 22, 8); } +Arrow::~Arrow() +{ + renderer->unload_sprite(sprite); +} + void Arrow::draw(const double player_x, const double player_y) const { renderer->draw_sprite_rotated( diff --git a/src/Arrow.hpp b/src/Arrow.hpp index 73d03b2..823fed5 100644 --- a/src/Arrow.hpp +++ b/src/Arrow.hpp @@ -19,6 +19,8 @@ private: public: Arrow(GameRenderer *renderer, double x, double y, double angle); + ~Arrow(); + void draw(double offset_x, double offset_y) const; void update(); diff --git a/src/Game.cpp b/src/Game.cpp index 4d3a291..c590e46 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -23,7 +23,7 @@ void Game::update(std::stop_token stop_token) zombo.update(player.x, player.y); } - if (ticks % 100 == 0) { + if (ticks % 100 == 0 && zombos.size() < 20) { zombos.push_back(Zombo(&renderer, 20.0, 20.0)); } @@ -45,11 +45,11 @@ void Game::draw() map.draw(player.x, player.y); - for (const Zombo zombo : zombos) { + for (const Zombo &zombo : zombos) { zombo.draw(player.x, player.y); } - for (const Arrow arrow : arrows) { + for (const Arrow &arrow : arrows) { arrow.draw(player.x, player.y); } @@ -109,7 +109,7 @@ void Game::run() } if (e.type == SDL_MOUSEBUTTONDOWN && e.button.button == 1) { - arrows.push_back(Arrow(&renderer, player.x, player.y, player.angle)); + arrows.emplace_back(&renderer, player.x, player.y, player.angle); } int mouse_x, mouse_y; diff --git a/src/GameRenderer.cpp b/src/GameRenderer.cpp index 33f1ef1..2798c9e 100644 --- a/src/GameRenderer.cpp +++ b/src/GameRenderer.cpp @@ -48,6 +48,11 @@ Sprite GameRenderer::load_sprite(const std::string &file, const int width, const }; } +void GameRenderer::unload_sprite(const Sprite &sprite) +{ + SDL_DestroyTexture(sprite.texture); +} + void GameRenderer::draw_sprite(const Sprite sprite, const int x, const int y) const { const SDL_Rect rect = { .x = x, .y = y, .w = sprite.width, .h = sprite.height }; diff --git a/src/GameRenderer.hpp b/src/GameRenderer.hpp index 3a43613..9997f3e 100644 --- a/src/GameRenderer.hpp +++ b/src/GameRenderer.hpp @@ -23,6 +23,8 @@ public: Sprite load_sprite(const std::string &file, int width, int height) const; + void unload_sprite(const Sprite &sprite); + void draw_sprite(Sprite sprite, int x, int y) const; void draw_sprite_rotated(Sprite sprite, int x, int y, double angle) const; diff --git a/src/Map.cpp b/src/Map.cpp index 06f40a4..e43d14a 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -28,6 +28,12 @@ Map::Map(GameRenderer *renderer, int tile_size) : } } +Map::~Map() +{ + renderer->unload_sprite(grass_sprite); + renderer->unload_sprite(path_sprite); +} + std::vector Map::generate_tiles(const std::vector &prev_tiles) const { std::vector new_tiles = std::vector(prev_tiles.size(), Tile::grass); diff --git a/src/Map.hpp b/src/Map.hpp index 63a8f2f..a05a168 100644 --- a/src/Map.hpp +++ b/src/Map.hpp @@ -24,6 +24,8 @@ public: Map(GameRenderer *renderer, int tile_size); + ~Map(); + void draw(double player_x, double player_y) const; void check_bounds(double player_x, double player_y); diff --git a/src/Player.cpp b/src/Player.cpp index fdd6ec9..3d08eca 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -8,6 +8,12 @@ Player::Player(GameRenderer *renderer) : renderer(renderer) bow_sprite = renderer->load_sprite("./assets/bow_arrow.png", 22, 32); } +Player::~Player() +{ + renderer->unload_sprite(hero_sprite); + renderer->unload_sprite(bow_sprite); +} + void Player::draw() const { renderer->draw_sprite( diff --git a/src/Player.hpp b/src/Player.hpp index c1c0728..f039eb9 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -22,6 +22,8 @@ public: Player(GameRenderer *renderer); + ~Player(); + void draw() const; void update(); diff --git a/src/Zombo.cpp b/src/Zombo.cpp index 248fbec..b33aadd 100644 --- a/src/Zombo.cpp +++ b/src/Zombo.cpp @@ -5,18 +5,17 @@ Zombo::Zombo(GameRenderer *renderer, const double x, const double y) : renderer( sprite = renderer->load_sprite("./assets/zombo.png", 40, 40); } +Zombo::~Zombo() +{ + renderer->unload_sprite(sprite); +} + void Zombo::update(const double player_x, const double player_y) { - double x_vel = 0, y_vel = 0; + double angle = std::atan2(player_y - y, player_x - x); - if (player_x > x) x_vel = speed; - else if (player_x < x) x_vel = -speed; - - if (player_y > y) y_vel = speed; - else if (player_y < y) y_vel = -speed; - - x += x_vel; - y += y_vel; + x += std::cos(angle) * speed; + y += std::sin(angle) * speed; } void Zombo::draw(const double player_x, const double player_y) const diff --git a/src/Zombo.hpp b/src/Zombo.hpp index dfba5d3..699d15b 100644 --- a/src/Zombo.hpp +++ b/src/Zombo.hpp @@ -18,6 +18,8 @@ private: public: Zombo(GameRenderer *renderer, double x, double y); + ~Zombo(); + void update(double player_x, double player_y); void draw(double player_x, double player_y) const;