From 6fe596bf48939875b34f429ed6e7e8fad86b3a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Sun, 6 Nov 2022 19:28:12 +0100 Subject: [PATCH] Trabajando en la pantalla de game over --- source/director.cpp | 2 +- source/game.cpp | 4 ++-- source/game_over.cpp | 35 ++++++++++++++++++++++++++++++----- source/game_over.h | 30 +++++++++++++++++++----------- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index c5d9a97..a91d4c9 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -9,7 +9,7 @@ Director::Director(int argc, char *argv[]) section.name = SECTION_PROG_LOGO; section.subsection = SUBSECTION_LOGO_TO_INTRO; - //section.name = SECTION_PROG_GAME; + section.name = SECTION_PROG_GAME; // Crea e inicializa las opciones del programa iniOptions(); diff --git a/source/game.cpp b/source/game.cpp index 76f7cc8..aeb1b5f 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -40,7 +40,7 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as // Inicializa el resto de variables ticks = 0; ticksSpeed = 15; - board.lives = 9; + board.lives = 0; board.items = 0; board.rooms = 1; board.music = true; @@ -370,7 +370,7 @@ void Game::checkIfPlayerIsAlive() // Comprueba si ha terminado la partida void Game::checkGameOver() { - if (board.lives < 0) + if (board.lives < 0 && blackScreenCounter > 17) { section.name = SECTION_PROG_GAME_OVER; } diff --git a/source/game_over.cpp b/source/game_over.cpp index 7e28de4..959a472 100644 --- a/source/game_over.cpp +++ b/source/game_over.cpp @@ -12,7 +12,7 @@ GameOver::GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, A // Reserva memoria para los punteros a objetos eventHandler = new SDL_Event(); - text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); + text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); // Inicializa variables counter = 0; @@ -20,6 +20,17 @@ GameOver::GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, A section.subsection = 0; ticks = 0; ticksSpeed = 15; + endSection = 300; + iniFade = 210; + fadeLenght = 30; + + // Inicializa el vector de colores + const std::vector colorList = {"white", "yellow", "cyan", "green", "magenta", "red", "blue", "black"}; + for (auto cl : colorList) + { + colors.push_back(stringToColor(options->palette, cl)); + } + color = colors.at(0); } // Destructor @@ -42,9 +53,12 @@ void GameOver::update() // Comprueba el manejador de eventos checkEventHandler(); + // Actualiza el color usado para renderizar los textos e imagenes + updateColor(); + counter++; - if (counter == 400) + if (counter == endSection) { section.name = SECTION_PROG_TITLE; } @@ -60,7 +74,10 @@ void GameOver::render() // Limpia la pantalla screen->clean(); - text->writeCentered(GAMECANVAS_CENTER_X, GAMECANVAS_CENTER_Y, "G A M E O V E R"); + // Escribe el texto de GAME OVER + text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, GAMECANVAS_CENTER_Y, "G A M E O V E R", 1, color); + + text->write(0, 0, std::to_string(counter)); // Vuelca el contenido del renderizador en pantalla screen->blit(); @@ -124,8 +141,8 @@ void GameOver::checkEventHandler() break; default: - //section.name = SECTION_PROG_TITLE; - //section.subsection = 0; + // section.name = SECTION_PROG_TITLE; + // section.subsection = 0; break; } } @@ -142,4 +159,12 @@ section_t GameOver::run() } return section; +} + +// Actualiza el color usado para renderizar los textos e imagenes +void GameOver::updateColor() +{ + const float step = std::min(std::max(counter, iniFade) - iniFade, fadeLenght) / (float)fadeLenght; + const int index = (colors.size() - 1) * step; + color = colors.at(index); } \ No newline at end of file diff --git a/source/game_over.h b/source/game_over.h index b98a4db..4ca24b1 100644 --- a/source/game_over.h +++ b/source/game_over.h @@ -19,19 +19,24 @@ class GameOver { private: // Objetos y punteros - SDL_Renderer *renderer; // El renderizador de la ventana - Screen *screen; // Objeto encargado de dibujar en pantalla - Resource *resource; // Objeto con los recursos - Asset *asset; // Objeto con los ficheros de recursos - options_t *options; // Puntero a las opciones del juego - SDL_Event *eventHandler; // Manejador de eventos - Text *text; // Objeto para escribir texto en pantalla + SDL_Renderer *renderer; // El renderizador de la ventana + Screen *screen; // Objeto encargado de dibujar en pantalla + Resource *resource; // Objeto con los recursos + Asset *asset; // Objeto con los ficheros de recursos + options_t *options; // Puntero a las opciones del juego + SDL_Event *eventHandler; // Manejador de eventos + Text *text; // Objeto para escribir texto en pantalla // Variables - int counter; // Contador - section_t section; // Estado del bucle principal para saber si continua o se sale - Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa - Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa + int counter; // Contador + section_t section; // Estado del bucle principal para saber si continua o se sale + Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa + Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa + std::vector colors; // Vector con los colores para el fade + color_t color; // Color usado para el texto y los sprites + int endSection; // Contador: cuando acaba la sección + int iniFade; // Contador: cuando emiepza el fade + int fadeLenght; // Contador: duración del fade // Actualiza el objeto void update(); @@ -42,6 +47,9 @@ private: // Comprueba el manejador de eventos void checkEventHandler(); + // Actualiza el color usado para renderizar los textos e imagenes + void updateColor(); + public: // Constructor GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options);