From f9774c8145f59d07358c791c1e0fc87c3f5f227f Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Mon, 25 Nov 2024 13:21:24 +0100 Subject: [PATCH] Add hitbox system --- Game.cpp | 60 +++++++++++++++++++++++++++++++++----------------------- Game.h | 8 +++++--- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/Game.cpp b/Game.cpp index 73a69ce..c235564 100644 --- a/Game.cpp +++ b/Game.cpp @@ -34,7 +34,12 @@ for (int i = 0; i < opponents.size(); i++) { opponents.erase(opponents.begin() + i); } if (player.x < o.x + 80 && player.x + 80 > o.x && player.y < o.y + 96 && player.y + 96 > o.y) { - player.health--; + if (player.health > 0) { + player.health--; + } else { + // TODO: Game over sccreen + } + opponents.erase(opponents.begin() + i); } } @@ -42,11 +47,7 @@ for (int i = 0; i < opponents.size(); i++) { void Game::renderHUD(SDL_Renderer *renderer, SDL_Texture *heart) { SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); - SDL_Rect bgRect; - bgRect.x = 0; - bgRect.y = 0; - bgRect.w = 30 * 3 + 15; - bgRect.h = 40; + SDL_Rect bgRect = {0, 0, 30 * 3 + 15, 40}; SDL_RenderFillRect(renderer, &bgRect); for (int i = 0; i < this->player.health; i++) { @@ -54,8 +55,14 @@ void Game::renderHUD(SDL_Renderer *renderer, SDL_Texture *heart) { } } -void Game::renderPlayer(SDL_Renderer *renderer, SDL_Texture *player, Player p) { - drawTexture(renderer, player, p.x, p.y, 80, 96); +void Game::renderPlayer(SDL_Renderer *renderer, SDL_Texture *playerTexture, Player p) { + drawTexture(renderer, playerTexture, p.x, p.y, 80, 96); + + if (showHitboxes) { + SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE); + SDL_Rect hitbox = {p.x, p.y, 80, 96}; + SDL_RenderDrawRect(renderer, &hitbox); + } } void Game::createOpponent() { @@ -92,9 +99,14 @@ void Game::createOpponent() { opponents.push_back(o); } +void Game::renderOpponent(SDL_Renderer *renderer, SDL_Texture *opponentTexture, Opponent o) { + drawTexture(renderer, opponentTexture, o.x, o.y, 80, 96); -void Game::renderOpponent(SDL_Renderer *renderer, SDL_Texture *opponent, Player p) { - drawTexture(renderer, opponent, p.x, p.y, 80, 96); + if (showHitboxes) { + SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE); + SDL_Rect hitbox = {o.x, o.y, 80, 96}; + SDL_RenderDrawRect(renderer, &hitbox); + } } void Game::render(SDL_Renderer *renderer, SDL_Texture *bg) { @@ -104,25 +116,24 @@ void Game::render(SDL_Renderer *renderer, SDL_Texture *bg) { drawTexture(renderer, bg, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); - SDL_Texture *player = IMG_LoadTexture(renderer, "./res/player.png"); - renderPlayer(renderer, player, this->player); - - SDL_Texture *opponent = IMG_LoadTexture(renderer, "./res/opponent.png"); + SDL_Texture *playerTexture = IMG_LoadTexture(renderer, "./res/player.png"); + renderPlayer(renderer, playerTexture, this->player); + SDL_Texture *opponentTexture = IMG_LoadTexture(renderer, "./res/opponent.png"); for (Opponent o: this->opponents) { - renderOpponent(renderer, opponent, o); + renderOpponent(renderer, opponentTexture, o); } SDL_Texture *heart = IMG_LoadTexture(renderer, "./res/heart.png"); renderHUD(renderer, heart); TTF_Init(); - TTF_Font *font = TTF_OpenFont("./res/Arial.ttf", 24); + TTF_Font *font = TTF_OpenFont("./res/font.ttf", 24); - drawText(renderer, font, "Time: " + std::to_string(timeMultiplier), 30 * 3 + 15 + 10, 10, 100, 30); + drawText(renderer, font, "h: " + std::to_string(player.health), 30 * 3 + 15 + 10, 10); - SDL_DestroyTexture(player); - SDL_DestroyTexture(opponent); + SDL_DestroyTexture(playerTexture); + SDL_DestroyTexture(opponentTexture); SDL_DestroyTexture(heart); SDL_RenderPresent(renderer); @@ -158,6 +169,9 @@ void Game::run() { case SDLK_d: keys[3] = isPressed; break; + case SDLK_h: + if (isPressed) showHitboxes = !showHitboxes; + break; } } } @@ -169,14 +183,12 @@ void Game::run() { checkCollision(); - if (rand() % 50 == 0) createOpponent(); + if (rand() % 100 == 0) createOpponent(); - for (int i = 0; i < opponents.size(); i++) { - opponents[i].move(timeMultiplier); + for (Opponent &o: opponents) { + o.move(10); } - timeMultiplier= (int) (time(nullptr) - startTime) / 10 + 1; - render(renderer, background); SDL_Delay(16); } diff --git a/Game.h b/Game.h index 16c1726..a816ac1 100644 --- a/Game.h +++ b/Game.h @@ -11,7 +11,7 @@ class Player { public: int x = 40; int y = 40; - int health = 3; + int unsigned health = 3; void moveX(int dx); void moveY(int dy); @@ -28,16 +28,18 @@ public: class Game { Player player; std::vector opponents; - int timeMultiplier = 1; + bool showHitboxes = false; void renderPlayer(SDL_Renderer *renderer, SDL_Texture *player, Player p); - void renderOpponent(SDL_Renderer *renderer, SDL_Texture *opponent, Player p); public: + void createOpponent(); void checkCollision(); void renderHUD(SDL_Renderer *renderer, SDL_Texture *heart); void render(SDL_Renderer *renderer, SDL_Texture *bg); void run(); + + void renderOpponent(SDL_Renderer *renderer, SDL_Texture *opponentTexture, Opponent o); };