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 0000000..c6a1938 Binary files /dev/null and b/assets/hero_front.png differ 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; }