From b2f888b55ff11c46f2ec66c0763d81449afa144d Mon Sep 17 00:00:00 2001 From: Reimar Date: Fri, 31 Oct 2025 12:27:31 +0100 Subject: [PATCH] Extract sprite into class --- Makefile | 5 +++-- src/Arrow.cpp | 12 ++++-------- src/Arrow.hpp | 5 ++--- src/Game.cpp | 2 +- src/GameRenderer.cpp | 14 +++----------- src/GameRenderer.hpp | 5 ++--- src/Map.cpp | 10 ++-------- src/Map.hpp | 6 +++--- src/Player.cpp | 18 ++++++------------ src/Player.hpp | 5 +++-- src/Sprite.cpp | 23 +++++++++++++++++++++++ src/Sprite.hpp | 11 +++++++++-- src/Zombo.cpp | 11 +++-------- src/Zombo.hpp | 5 ++--- 14 files changed, 66 insertions(+), 66 deletions(-) create mode 100644 src/Sprite.cpp diff --git a/Makefile b/Makefile index 65b9356..fbec4cf 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ OBJS= \ build/src/Game.o \ build/src/Arrow.o \ build/src/Zombo.o \ + build/src/Sprite.o \ build/src/Player.o \ build/src/GameRenderer.o @@ -16,8 +17,8 @@ RELEASE=0 ifeq ($(RELEASE), 1) CXX_FLAGS += -Werror else - CXX_FLAGS += -fsanitize=address,undefined - LINKER_FLAGS += -fsanitize=address,undefined + CXX_FLAGS += -fsanitize=address,undefined -g -Og -rdynamic + LINKER_FLAGS += -fsanitize=address,undefined -g -Og -rdynamic endif CXX_FLAGS += $(shell pkg-config sdl2 SDL2_image --cflags) diff --git a/src/Arrow.cpp b/src/Arrow.cpp index 93f33b4..e1ed310 100644 --- a/src/Arrow.cpp +++ b/src/Arrow.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "Arrow.hpp" Arrow::Arrow(GameRenderer *renderer, const double x, const double y, const double angle) @@ -8,17 +9,12 @@ 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( - sprite, - (int)(x - sprite.width / 2 + renderer->screen_width / 2 - player_x), - (int)(y - sprite.height / 2 + renderer->screen_height / 2 - player_y), + *sprite, + (int)(x - sprite->width / 2 + renderer->screen_width / 2 - player_x), + (int)(y - sprite->height / 2 + renderer->screen_height / 2 - player_y), angle * 180 / std::numbers::pi ); } diff --git a/src/Arrow.hpp b/src/Arrow.hpp index 823fed5..d2f7f09 100644 --- a/src/Arrow.hpp +++ b/src/Arrow.hpp @@ -1,6 +1,7 @@ #ifndef ARROW_HPP #define ARROW_HPP +#include #include "GameRenderer.hpp" #include "Sprite.hpp" @@ -8,7 +9,7 @@ class Arrow { private: GameRenderer *renderer; - Sprite sprite; + std::unique_ptr sprite; double x; double y; @@ -19,8 +20,6 @@ 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 c590e46..c4dfd5b 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -24,7 +24,7 @@ void Game::update(std::stop_token stop_token) } if (ticks % 100 == 0 && zombos.size() < 20) { - zombos.push_back(Zombo(&renderer, 20.0, 20.0)); + zombos.emplace_back(&renderer, 20.0, 20.0); } renderer.redraw(); diff --git a/src/GameRenderer.cpp b/src/GameRenderer.cpp index 2798c9e..789571d 100644 --- a/src/GameRenderer.cpp +++ b/src/GameRenderer.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "Sprite.hpp" #include "GameRenderer.hpp" @@ -39,18 +40,9 @@ GameRenderer::~GameRenderer() SDL_DestroyWindow(window); } -Sprite GameRenderer::load_sprite(const std::string &file, const int width, const int height) const +std::unique_ptr GameRenderer::load_sprite(const std::string &file, const int width, const int height) const { - return Sprite { - .texture = IMG_LoadTexture(renderer, file.c_str()), - .width = width, - .height = height - }; -} - -void GameRenderer::unload_sprite(const Sprite &sprite) -{ - SDL_DestroyTexture(sprite.texture); + return std::make_unique(Sprite({ renderer, file, width, height })); } void GameRenderer::draw_sprite(const Sprite sprite, const int x, const int y) const diff --git a/src/GameRenderer.hpp b/src/GameRenderer.hpp index 9997f3e..9a43a2e 100644 --- a/src/GameRenderer.hpp +++ b/src/GameRenderer.hpp @@ -1,6 +1,7 @@ #ifndef GAME_RENDERER_HPP #define GAME_RENDERER_HPP +#include #include #include #include "Sprite.hpp" @@ -21,9 +22,7 @@ public: ~GameRenderer(); - Sprite load_sprite(const std::string &file, int width, int height) const; - - void unload_sprite(const Sprite &sprite); + std::unique_ptr load_sprite(const std::string &file, int width, int height) const; void draw_sprite(Sprite sprite, int x, int y) const; diff --git a/src/Map.cpp b/src/Map.cpp index e43d14a..10abc1f 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -28,12 +28,6 @@ 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); @@ -109,8 +103,8 @@ void Map::draw(const double player_x, const double player_y) const } switch (tiles[tile_x][tile_y]) { - case Tile::grass: renderer->draw_sprite(grass_sprite, screen_x, screen_y); break; - case Tile::path: renderer->draw_sprite(path_sprite, screen_x, screen_y); break; + case Tile::grass: renderer->draw_sprite(*grass_sprite, screen_x, screen_y); break; + case Tile::path: renderer->draw_sprite(*path_sprite, screen_x, screen_y); break; } } } diff --git a/src/Map.hpp b/src/Map.hpp index a05a168..46ae106 100644 --- a/src/Map.hpp +++ b/src/Map.hpp @@ -2,6 +2,7 @@ #define MAP_HPP #include +#include #include "Tile.hpp" #include "Sprite.hpp" #include "GameRenderer.hpp" @@ -12,8 +13,7 @@ private: GameRenderer *renderer; std::vector> tiles; - Sprite grass_sprite; - Sprite path_sprite; + std::unique_ptr grass_sprite, path_sprite; [[nodiscard]] std::vector generate_tiles(const std::vector &prev_tiles) const; @@ -24,7 +24,7 @@ public: Map(GameRenderer *renderer, int tile_size); - ~Map(); + ~Map() = default; void draw(double player_x, double player_y) const; diff --git a/src/Player.cpp b/src/Player.cpp index 3d08eca..5d780d1 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -8,24 +8,18 @@ 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( - hero_sprite, - renderer->screen_width / 2 - hero_sprite.width / 2, - renderer->screen_height / 2 - hero_sprite.height / 2 + *hero_sprite, + renderer->screen_width / 2 - hero_sprite->width / 2, + renderer->screen_height / 2 - hero_sprite->height / 2 ); renderer->draw_sprite_rotated( - bow_sprite, - (int)(renderer->screen_width / 2 - bow_sprite.width / 2 + std::cos(angle) * 30), - (int)(renderer->screen_height / 2 - bow_sprite.height / 2 + std::sin(angle) * 30), + *bow_sprite, + (int)(renderer->screen_width / 2 - bow_sprite->width / 2 + std::cos(angle) * 30), + (int)(renderer->screen_height / 2 - bow_sprite->height / 2 + std::sin(angle) * 30), angle * 180 / std::numbers::pi ); } diff --git a/src/Player.hpp b/src/Player.hpp index f039eb9..7d97226 100644 --- a/src/Player.hpp +++ b/src/Player.hpp @@ -1,13 +1,14 @@ #ifndef PLAYER_HPP #define PLAYER_HPP +#include #include "GameRenderer.hpp" class Player { private: GameRenderer *renderer; - Sprite hero_sprite, bow_sprite; + std::unique_ptr hero_sprite, bow_sprite; public: double x = 0; @@ -22,7 +23,7 @@ public: Player(GameRenderer *renderer); - ~Player(); + ~Player() = default; void draw() const; diff --git a/src/Sprite.cpp b/src/Sprite.cpp new file mode 100644 index 0000000..510adaa --- /dev/null +++ b/src/Sprite.cpp @@ -0,0 +1,23 @@ +#include +#include +#include "Sprite.hpp" +#include +#include +#include + +Sprite::Sprite(SDL_Renderer *renderer, const std::string &file, int width, int height) : width(width), height(height) +{ + texture = IMG_LoadTexture(renderer, file.c_str()); + this->file = std::string(file); +} + +Sprite::~Sprite() +{ + std::cout << "destruct " << file << std::endl; + + void *array[10]; + size_t size = backtrace(array, 10); + backtrace_symbols_fd(array, size, STDERR_FILENO); + + SDL_DestroyTexture(texture); +} diff --git a/src/Sprite.hpp b/src/Sprite.hpp index 4b65b2b..2316d08 100644 --- a/src/Sprite.hpp +++ b/src/Sprite.hpp @@ -2,11 +2,18 @@ #define SPRITE_HPP #include +#include -typedef struct { +class Sprite { +public: SDL_Texture *texture; int width; int height; -} Sprite; + std::string file; + + Sprite(SDL_Renderer *renderer, const std::string &file, int width, int height); + + ~Sprite(); +}; #endif diff --git a/src/Zombo.cpp b/src/Zombo.cpp index b33aadd..38d0802 100644 --- a/src/Zombo.cpp +++ b/src/Zombo.cpp @@ -5,11 +5,6 @@ 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 angle = std::atan2(player_y - y, player_x - x); @@ -21,8 +16,8 @@ void Zombo::update(const double player_x, const double player_y) void Zombo::draw(const double player_x, const double player_y) const { renderer->draw_sprite( - sprite, - (int)(x - sprite.width / 2.0 + renderer->screen_width / 2.0 - player_x), - (int)(y - sprite.height / 2.0 + renderer->screen_height / 2.0 - player_y) + *sprite, + (int)(x - sprite->width / 2.0 + renderer->screen_width / 2.0 - player_x), + (int)(y - sprite->height / 2.0 + renderer->screen_height / 2.0 - player_y) ); } diff --git a/src/Zombo.hpp b/src/Zombo.hpp index 699d15b..16e113c 100644 --- a/src/Zombo.hpp +++ b/src/Zombo.hpp @@ -1,6 +1,7 @@ #ifndef ZOMBO_HPP #define ZOMBO_HPP +#include #include "Sprite.hpp" #include "GameRenderer.hpp" @@ -8,7 +9,7 @@ class Zombo { private: GameRenderer *renderer; - Sprite sprite; + std::unique_ptr sprite; double x; double y; @@ -18,8 +19,6 @@ 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;