Extract sprite into class
This commit is contained in:
parent
37dd9606cc
commit
b2f888b55f
5
Makefile
5
Makefile
@ -4,6 +4,7 @@ OBJS= \
|
|||||||
build/src/Game.o \
|
build/src/Game.o \
|
||||||
build/src/Arrow.o \
|
build/src/Arrow.o \
|
||||||
build/src/Zombo.o \
|
build/src/Zombo.o \
|
||||||
|
build/src/Sprite.o \
|
||||||
build/src/Player.o \
|
build/src/Player.o \
|
||||||
build/src/GameRenderer.o
|
build/src/GameRenderer.o
|
||||||
|
|
||||||
@ -16,8 +17,8 @@ RELEASE=0
|
|||||||
ifeq ($(RELEASE), 1)
|
ifeq ($(RELEASE), 1)
|
||||||
CXX_FLAGS += -Werror
|
CXX_FLAGS += -Werror
|
||||||
else
|
else
|
||||||
CXX_FLAGS += -fsanitize=address,undefined
|
CXX_FLAGS += -fsanitize=address,undefined -g -Og -rdynamic
|
||||||
LINKER_FLAGS += -fsanitize=address,undefined
|
LINKER_FLAGS += -fsanitize=address,undefined -g -Og -rdynamic
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CXX_FLAGS += $(shell pkg-config sdl2 SDL2_image --cflags)
|
CXX_FLAGS += $(shell pkg-config sdl2 SDL2_image --cflags)
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <numbers>
|
#include <numbers>
|
||||||
|
#include <memory>
|
||||||
#include "Arrow.hpp"
|
#include "Arrow.hpp"
|
||||||
|
|
||||||
Arrow::Arrow(GameRenderer *renderer, const double x, const double y, const double angle)
|
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);
|
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(
|
||||||
sprite,
|
*sprite,
|
||||||
(int)(x - sprite.width / 2 + renderer->screen_width / 2 - player_x),
|
(int)(x - sprite->width / 2 + renderer->screen_width / 2 - player_x),
|
||||||
(int)(y - sprite.height / 2 + renderer->screen_height / 2 - player_y),
|
(int)(y - sprite->height / 2 + renderer->screen_height / 2 - player_y),
|
||||||
angle * 180 / std::numbers::pi
|
angle * 180 / std::numbers::pi
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#ifndef ARROW_HPP
|
#ifndef ARROW_HPP
|
||||||
#define ARROW_HPP
|
#define ARROW_HPP
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include "GameRenderer.hpp"
|
#include "GameRenderer.hpp"
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
|
|
||||||
@ -8,7 +9,7 @@ class Arrow
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
GameRenderer *renderer;
|
GameRenderer *renderer;
|
||||||
Sprite sprite;
|
std::unique_ptr<Sprite> sprite;
|
||||||
|
|
||||||
double x;
|
double x;
|
||||||
double y;
|
double y;
|
||||||
@ -19,8 +20,6 @@ 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();
|
||||||
|
|||||||
@ -24,7 +24,7 @@ void Game::update(std::stop_token stop_token)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ticks % 100 == 0 && zombos.size() < 20) {
|
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();
|
renderer.redraw();
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
#include <SDL2/SDL_image.h>
|
#include <SDL2/SDL_image.h>
|
||||||
|
#include <memory>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
#include "GameRenderer.hpp"
|
#include "GameRenderer.hpp"
|
||||||
@ -39,18 +40,9 @@ GameRenderer::~GameRenderer()
|
|||||||
SDL_DestroyWindow(window);
|
SDL_DestroyWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
Sprite GameRenderer::load_sprite(const std::string &file, const int width, const int height) const
|
std::unique_ptr<Sprite> GameRenderer::load_sprite(const std::string &file, const int width, const int height) const
|
||||||
{
|
{
|
||||||
return Sprite {
|
return std::make_unique<Sprite>(Sprite({ renderer, file, width, height }));
|
||||||
.texture = IMG_LoadTexture(renderer, file.c_str()),
|
|
||||||
.width = width,
|
|
||||||
.height = height
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#ifndef GAME_RENDERER_HPP
|
#ifndef GAME_RENDERER_HPP
|
||||||
#define GAME_RENDERER_HPP
|
#define GAME_RENDERER_HPP
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
@ -21,9 +22,7 @@ public:
|
|||||||
|
|
||||||
~GameRenderer();
|
~GameRenderer();
|
||||||
|
|
||||||
Sprite load_sprite(const std::string &file, int width, int height) const;
|
std::unique_ptr<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;
|
||||||
|
|
||||||
|
|||||||
10
src/Map.cpp
10
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<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);
|
||||||
@ -109,8 +103,8 @@ void Map::draw(const double player_x, const double player_y) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (tiles[tile_x][tile_y]) {
|
switch (tiles[tile_x][tile_y]) {
|
||||||
case Tile::grass: renderer->draw_sprite(grass_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;
|
case Tile::path: renderer->draw_sprite(*path_sprite, screen_x, screen_y); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#define MAP_HPP
|
#define MAP_HPP
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
#include "Tile.hpp"
|
#include "Tile.hpp"
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
#include "GameRenderer.hpp"
|
#include "GameRenderer.hpp"
|
||||||
@ -12,8 +13,7 @@ private:
|
|||||||
GameRenderer *renderer;
|
GameRenderer *renderer;
|
||||||
std::vector<std::vector<Tile>> tiles;
|
std::vector<std::vector<Tile>> tiles;
|
||||||
|
|
||||||
Sprite grass_sprite;
|
std::unique_ptr<Sprite> grass_sprite, path_sprite;
|
||||||
Sprite path_sprite;
|
|
||||||
|
|
||||||
[[nodiscard]] std::vector<Tile> generate_tiles(const std::vector<Tile> &prev_tiles) const;
|
[[nodiscard]] std::vector<Tile> generate_tiles(const std::vector<Tile> &prev_tiles) const;
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ public:
|
|||||||
|
|
||||||
Map(GameRenderer *renderer, int tile_size);
|
Map(GameRenderer *renderer, int tile_size);
|
||||||
|
|
||||||
~Map();
|
~Map() = default;
|
||||||
|
|
||||||
void draw(double player_x, double player_y) const;
|
void draw(double player_x, double player_y) const;
|
||||||
|
|
||||||
|
|||||||
@ -8,24 +8,18 @@ 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(
|
||||||
hero_sprite,
|
*hero_sprite,
|
||||||
renderer->screen_width / 2 - hero_sprite.width / 2,
|
renderer->screen_width / 2 - hero_sprite->width / 2,
|
||||||
renderer->screen_height / 2 - hero_sprite.height / 2
|
renderer->screen_height / 2 - hero_sprite->height / 2
|
||||||
);
|
);
|
||||||
|
|
||||||
renderer->draw_sprite_rotated(
|
renderer->draw_sprite_rotated(
|
||||||
bow_sprite,
|
*bow_sprite,
|
||||||
(int)(renderer->screen_width / 2 - bow_sprite.width / 2 + std::cos(angle) * 30),
|
(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),
|
(int)(renderer->screen_height / 2 - bow_sprite->height / 2 + std::sin(angle) * 30),
|
||||||
angle * 180 / std::numbers::pi
|
angle * 180 / std::numbers::pi
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,14 @@
|
|||||||
#ifndef PLAYER_HPP
|
#ifndef PLAYER_HPP
|
||||||
#define PLAYER_HPP
|
#define PLAYER_HPP
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include "GameRenderer.hpp"
|
#include "GameRenderer.hpp"
|
||||||
|
|
||||||
class Player
|
class Player
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
GameRenderer *renderer;
|
GameRenderer *renderer;
|
||||||
Sprite hero_sprite, bow_sprite;
|
std::unique_ptr<Sprite> hero_sprite, bow_sprite;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
double x = 0;
|
double x = 0;
|
||||||
@ -22,7 +23,7 @@ public:
|
|||||||
|
|
||||||
Player(GameRenderer *renderer);
|
Player(GameRenderer *renderer);
|
||||||
|
|
||||||
~Player();
|
~Player() = default;
|
||||||
|
|
||||||
void draw() const;
|
void draw() const;
|
||||||
|
|
||||||
|
|||||||
23
src/Sprite.cpp
Normal file
23
src/Sprite.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include <SDL2/SDL_render.h>
|
||||||
|
#include <SDL2/SDL_image.h>
|
||||||
|
#include "Sprite.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
@ -2,11 +2,18 @@
|
|||||||
#define SPRITE_HPP
|
#define SPRITE_HPP
|
||||||
|
|
||||||
#include <SDL2/SDL_render.h>
|
#include <SDL2/SDL_render.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
typedef struct {
|
class Sprite {
|
||||||
|
public:
|
||||||
SDL_Texture *texture;
|
SDL_Texture *texture;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
} Sprite;
|
std::string file;
|
||||||
|
|
||||||
|
Sprite(SDL_Renderer *renderer, const std::string &file, int width, int height);
|
||||||
|
|
||||||
|
~Sprite();
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -5,11 +5,6 @@ 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 angle = std::atan2(player_y - y, player_x - x);
|
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
|
void Zombo::draw(const double player_x, const double player_y) const
|
||||||
{
|
{
|
||||||
renderer->draw_sprite(
|
renderer->draw_sprite(
|
||||||
sprite,
|
*sprite,
|
||||||
(int)(x - sprite.width / 2.0 + renderer->screen_width / 2.0 - player_x),
|
(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)
|
(int)(y - sprite->height / 2.0 + renderer->screen_height / 2.0 - player_y)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#ifndef ZOMBO_HPP
|
#ifndef ZOMBO_HPP
|
||||||
#define ZOMBO_HPP
|
#define ZOMBO_HPP
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include "Sprite.hpp"
|
#include "Sprite.hpp"
|
||||||
#include "GameRenderer.hpp"
|
#include "GameRenderer.hpp"
|
||||||
|
|
||||||
@ -8,7 +9,7 @@ class Zombo
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
GameRenderer *renderer;
|
GameRenderer *renderer;
|
||||||
Sprite sprite;
|
std::unique_ptr<Sprite> sprite;
|
||||||
|
|
||||||
double x;
|
double x;
|
||||||
double y;
|
double y;
|
||||||
@ -18,8 +19,6 @@ 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;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user