From 5dcef29a0e7a1b9ea58acfb0080e476d20873424 Mon Sep 17 00:00:00 2001 From: Reimar Date: Thu, 23 Oct 2025 10:23:53 +0200 Subject: [PATCH] Create class structure, add player --- Makefile | 10 +++---- assets/hero_front.png | Bin 0 -> 495 bytes src/Game.cpp | 27 +++++++++++++++++ src/Game.hpp | 19 ++++++++++++ src/GameRenderer.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++ src/GameRenderer.hpp | 33 +++++++++++++++++++++ src/Player.cpp | 16 ++++++++++ src/Player.hpp | 20 +++++++++++++ src/Sprite.hpp | 12 ++++++++ src/main.cpp | 48 ++---------------------------- 10 files changed, 201 insertions(+), 50 deletions(-) create mode 100644 assets/hero_front.png create mode 100644 src/Game.cpp create mode 100644 src/Game.hpp create mode 100644 src/GameRenderer.cpp create mode 100644 src/GameRenderer.hpp create mode 100644 src/Player.cpp create mode 100644 src/Player.hpp create mode 100644 src/Sprite.hpp diff --git a/Makefile b/Makefile index b30713e..70d6b59 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ OBJS= \ - build/lib/glad.o \ build/src/main.o \ + build/src/Game.o \ + build/src/Player.o \ + build/src/GameRenderer.o -LIBS=-lSDL2 +LIBS=-lSDL2 -lSDL2_image -CFLAGS=-Iinclude - -build/%.o: %.cpp $(wildcard *.h) +build/%.o: %.cpp $(wildcard *.hpp) mkdir -p `dirname $@` g++ $(CFLAGS) -c -o $@ $< $(LIBS) diff --git a/assets/hero_front.png b/assets/hero_front.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a193856f9346979b2dba9dcebbd4b564412835 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEjKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG z?d}4kf#9d}Zjfo51s;*b3=De8Ak0{?)V>TT$X?><>&pI;ON`shAo1)zph=9zo-U3d z5r^N-u;n`BAkccBMX-oLyFVfMrRbXCR?#9(!H*JpVNu7zKCqRUSvE~=o!jNRrbQ*^ zPQ2pov{i3%%F=#R%$9Vzu$`&Q%}U=rW9LM@od=V0rheFEll_#hX@PLjGL^k*87}Kw z+%mpa7)@HMeq-{)$$~3yKQ;Kh%YM$ft&e`LcMLV!6{hs^yKbLKiDzqzN4Rg@bk=R( z#H@F2U1uVF&m`H)V}UzYShJV#=d@~ehCPoY7%tS?X#MuBYqfc@myMfYhA|sML}A~j zsHs!V#P|P>tajh9@qmfq63)MS7$W7?R~Lpa2-Pn$?35^z_|G}XGyUgP8-a5+JNEmw z{Hr;>Z=SU3o>vuhazEz#U#UDc#biqQ8i7e~?5@N%&XTg(6ugx=rK;2CeEaA2t4eKG de_j)=VV;#8r@YARPbw(5Jzf1=);T3K0RTZrxrzV) literal 0 HcmV?d00001 diff --git a/src/Game.cpp b/src/Game.cpp new file mode 100644 index 0000000..163725e --- /dev/null +++ b/src/Game.cpp @@ -0,0 +1,27 @@ +#include "GameRenderer.hpp" +#include "Player.hpp" +#include "Game.hpp" + +Game::Game() +{ + renderer = new GameRenderer("Zombo Shooter", 800, 450); + player = new Player(renderer); +} + +void Game::run() const +{ + while (true) { + SDL_Event e; + SDL_WaitEvent(&e); + + if (e.type == SDL_QUIT) { + break; + } + + renderer->clear_screen(0x80, 0x40, 0xFF, 0xFF); + + player->draw(); + + renderer->flush(); + } +} diff --git a/src/Game.hpp b/src/Game.hpp new file mode 100644 index 0000000..361b9bb --- /dev/null +++ b/src/Game.hpp @@ -0,0 +1,19 @@ +#ifndef GAME_HPP +#define GAME_HPP + +#include "GameRenderer.hpp" +#include "Player.hpp" + +class Game +{ +private: + GameRenderer *renderer; + Player *player; + +public: + Game(); + + void run() const; +}; + +#endif diff --git a/src/GameRenderer.cpp b/src/GameRenderer.cpp new file mode 100644 index 0000000..a7f7167 --- /dev/null +++ b/src/GameRenderer.cpp @@ -0,0 +1,66 @@ +#include +#include +#include "Sprite.hpp" +#include "GameRenderer.hpp" + +GameRenderer::GameRenderer(const std::string &title, const int screen_width, const int screen_height) + : title(title), screen_width(screen_width), screen_height(screen_height) +{ + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + std::cerr << "Unable to initialize SDL" << std::endl; + exit(EXIT_FAILURE); + } + + SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0"); + + window = SDL_CreateWindow( + title.c_str(), + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + screen_width, screen_height, + SDL_WINDOW_SHOWN + ); + + if (!window) { + std::cerr << "Could not create window" << std::endl; + exit(EXIT_FAILURE); + } + + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + + if (!renderer) { + std::cerr << "Could not create renderer" << std::endl; + exit(EXIT_FAILURE); + } +} + +GameRenderer::~GameRenderer() +{ + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); +} + +Sprite 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::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 }; + SDL_RenderCopy(renderer, sprite.texture, nullptr, &rect); +} + +void GameRenderer::clear_screen(const int r, const int g, const int b, const int a) const +{ + SDL_SetRenderDrawColor(renderer, r, g, b, a); + SDL_RenderClear(renderer); +} + +void GameRenderer::flush() const +{ + SDL_RenderPresent(renderer); +} diff --git a/src/GameRenderer.hpp b/src/GameRenderer.hpp new file mode 100644 index 0000000..86a79c3 --- /dev/null +++ b/src/GameRenderer.hpp @@ -0,0 +1,33 @@ +#ifndef GAME_RENDERER_HPP +#define GAME_RENDERER_HPP + +#include +#include +#include "Sprite.hpp" + +class GameRenderer +{ +private: + SDL_Renderer *renderer; + SDL_Window *window; + + std::string title; + +public: + int screen_width; + int screen_height; + + GameRenderer(const std::string &title, int screen_width, int screen_height); + + ~GameRenderer(); + + Sprite load_sprite(const std::string &file, int width, int height) const; + + void draw_sprite(Sprite sprite, int x, int y) const; + + void clear_screen(int r, int g, int b, int a) const; + + void flush() const; +}; + +#endif \ No newline at end of file diff --git a/src/Player.cpp b/src/Player.cpp new file mode 100644 index 0000000..0fd03ed --- /dev/null +++ b/src/Player.cpp @@ -0,0 +1,16 @@ +#include "GameRenderer.hpp" +#include "Player.hpp" + +Player::Player(GameRenderer *renderer) : renderer(renderer) +{ + hero_sprite = renderer->load_sprite("./assets/hero_front.png", 40, 40); +} + +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 + ); +} diff --git a/src/Player.hpp b/src/Player.hpp new file mode 100644 index 0000000..f17057c --- /dev/null +++ b/src/Player.hpp @@ -0,0 +1,20 @@ +#ifndef PLAYER_HPP +#define PLAYER_HPP + +#include "GameRenderer.hpp" + +class Player +{ +private: + GameRenderer *renderer; + Sprite hero_sprite; + int x = 0; + int y = 0; + +public: + Player(GameRenderer *renderer); + + void draw() const; +}; + +#endif \ No newline at end of file diff --git a/src/Sprite.hpp b/src/Sprite.hpp new file mode 100644 index 0000000..4b65b2b --- /dev/null +++ b/src/Sprite.hpp @@ -0,0 +1,12 @@ +#ifndef SPRITE_HPP +#define SPRITE_HPP + +#include + +typedef struct { + SDL_Texture *texture; + int width; + int height; +} Sprite; + +#endif diff --git a/src/main.cpp b/src/main.cpp index 59efeab..6ccf308 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,52 +1,10 @@ -#include -#include - -#define SCREEN_WIDTH 800 -#define SCREEN_HEIGHT 450 +#include "Game.hpp" int main() { - if (SDL_Init(SDL_INIT_VIDEO) < 0) { - std::cerr << "Unable to initialize SDL" << std::endl; - return EXIT_FAILURE; - } + const Game *game = new Game(); - SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0"); - - SDL_Window *window = SDL_CreateWindow( - "Zombo Shooter", - SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, - SCREEN_WIDTH, SCREEN_HEIGHT, - SDL_WINDOW_SHOWN - ); - - if (!window) { - std::cerr << "Could not create window" << std::endl; - return EXIT_FAILURE; - } - - SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); - - if (!renderer) { - std::cerr << "Could not create renderer" << std::endl; - return EXIT_FAILURE; - } - - while (true) { - SDL_Event e; - SDL_WaitEvent(&e); - - if (e.type == SDL_QUIT) { - break; - } - - SDL_SetRenderDrawColor(renderer, 0x80, 0x40, 0xFF, 0xFF); - SDL_RenderClear(renderer); - SDL_RenderPresent(renderer); - } - - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); + game->run(); return 0; }