Destroy sprites on quit, other fixes

This commit is contained in:
Reimar 2025-10-31 10:50:31 +01:00
parent ce2113d910
commit 37dd9606cc
11 changed files with 44 additions and 13 deletions

View File

@ -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); 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 void Arrow::draw(const double player_x, const double player_y) const
{ {
renderer->draw_sprite_rotated( renderer->draw_sprite_rotated(

View File

@ -19,6 +19,8 @@ private:
public: public:
Arrow(GameRenderer *renderer, double x, double y, double angle); Arrow(GameRenderer *renderer, double x, double y, double angle);
~Arrow();
void draw(double offset_x, double offset_y) const; void draw(double offset_x, double offset_y) const;
void update(); void update();

View File

@ -23,7 +23,7 @@ void Game::update(std::stop_token stop_token)
zombo.update(player.x, player.y); 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)); zombos.push_back(Zombo(&renderer, 20.0, 20.0));
} }
@ -45,11 +45,11 @@ void Game::draw()
map.draw(player.x, player.y); map.draw(player.x, player.y);
for (const Zombo zombo : zombos) { for (const Zombo &zombo : zombos) {
zombo.draw(player.x, player.y); zombo.draw(player.x, player.y);
} }
for (const Arrow arrow : arrows) { for (const Arrow &arrow : arrows) {
arrow.draw(player.x, player.y); arrow.draw(player.x, player.y);
} }
@ -109,7 +109,7 @@ void Game::run()
} }
if (e.type == SDL_MOUSEBUTTONDOWN && e.button.button == 1) { 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; int mouse_x, mouse_y;

View File

@ -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 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 }; const SDL_Rect rect = { .x = x, .y = y, .w = sprite.width, .h = sprite.height };

View File

@ -23,6 +23,8 @@ public:
Sprite load_sprite(const std::string &file, int width, int height) const; 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(Sprite sprite, int x, int y) const;
void draw_sprite_rotated(Sprite sprite, int x, int y, double angle) const; void draw_sprite_rotated(Sprite sprite, int x, int y, double angle) const;

View File

@ -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<Tile> Map::generate_tiles(const std::vector<Tile> &prev_tiles) const std::vector<Tile> Map::generate_tiles(const std::vector<Tile> &prev_tiles) const
{ {
std::vector<Tile> new_tiles = std::vector(prev_tiles.size(), Tile::grass); std::vector<Tile> new_tiles = std::vector(prev_tiles.size(), Tile::grass);

View File

@ -24,6 +24,8 @@ public:
Map(GameRenderer *renderer, int tile_size); Map(GameRenderer *renderer, int tile_size);
~Map();
void draw(double player_x, double player_y) const; void draw(double player_x, double player_y) const;
void check_bounds(double player_x, double player_y); void check_bounds(double player_x, double player_y);

View File

@ -8,6 +8,12 @@ Player::Player(GameRenderer *renderer) : renderer(renderer)
bow_sprite = renderer->load_sprite("./assets/bow_arrow.png", 22, 32); 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 void Player::draw() const
{ {
renderer->draw_sprite( renderer->draw_sprite(

View File

@ -22,6 +22,8 @@ public:
Player(GameRenderer *renderer); Player(GameRenderer *renderer);
~Player();
void draw() const; void draw() const;
void update(); void update();

View File

@ -5,18 +5,17 @@ Zombo::Zombo(GameRenderer *renderer, const double x, const double y) : renderer(
sprite = renderer->load_sprite("./assets/zombo.png", 40, 40); 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) 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; x += std::cos(angle) * speed;
else if (player_x < x) x_vel = -speed; y += std::sin(angle) * speed;
if (player_y > y) y_vel = speed;
else if (player_y < y) y_vel = -speed;
x += x_vel;
y += y_vel;
} }
void Zombo::draw(const double player_x, const double player_y) const void Zombo::draw(const double player_x, const double player_y) const

View File

@ -18,6 +18,8 @@ private:
public: public:
Zombo(GameRenderer *renderer, double x, double y); Zombo(GameRenderer *renderer, double x, double y);
~Zombo();
void update(double player_x, double player_y); void update(double player_x, double player_y);
void draw(double player_x, double player_y) const; void draw(double player_x, double player_y) const;