From 551116083690f8f0c30e29df6e77e94595f8478a Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 9 Jul 2024 09:15:02 +0200 Subject: [PATCH] fade-in implementado en la calse fade repaso general a toda la clase fade --- source/fade.cpp | 174 +++++++++++++++++++-------------------- source/fade.h | 11 ++- source/game.cpp | 2 +- source/hiscore_table.cpp | 20 +++-- source/hiscore_table.h | 2 + 5 files changed, 112 insertions(+), 97 deletions(-) diff --git a/source/fade.cpp b/source/fade.cpp index e50275e..3091cf5 100644 --- a/source/fade.cpp +++ b/source/fade.cpp @@ -46,64 +46,9 @@ void Fade::init() // Pinta una transición en pantalla void Fade::render() { - if (enabled && !finished) + if (enabled || finished) { - switch (type) - { - case FADE_FULLSCREEN: - { - SDL_SetTextureAlphaMod(backbuffer, std::min(counter * 4, 255)); - SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); - - break; - } - - case FADE_CENTER: - { - SDL_SetRenderDrawColor(renderer, r, g, b, 64); - - for (int i = 0; i < counter; i++) - { - rect1.h = rect2.h = i * 4; - rect2.y = param->gameHeight - (i * 4); - - SDL_RenderFillRect(renderer, &rect1); - SDL_RenderFillRect(renderer, &rect2); - } - - break; - } - - case FADE_RANDOM_SQUARE: - { - SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); - - break; - } - - case FADE_VENETIAN: - { - SDL_SetRenderDrawColor(renderer, r, g, b, 0xFF); - for (auto rect : square) - { - SDL_RenderFillRect(renderer, &rect); - } - - break; - } - - default: - { - break; - } - } - } - - // Pone el color en toda la textura - if (finished) - { - SDL_SetRenderDrawColor(renderer, r, g, b, 255); - SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); } } @@ -116,18 +61,44 @@ void Fade::update() { case FADE_FULLSCREEN: { + // Modifica la transparencia de la textura + a = std::min(counter * 4, 255); + SDL_SetTextureAlphaMod(backbuffer, a); + + // Comprueba si ha terminado if (counter >= 255 / 4) { finished = true; } + break; } case FADE_CENTER: { + // Dibuja sobre el backbuffer + SDL_Texture *temp = SDL_GetRenderTarget(renderer); + SDL_SetRenderTarget(renderer, backbuffer); + + SDL_SetRenderDrawColor(renderer, r, g, b, a); + + for (int i = 0; i < counter; i++) + { + rect1.h = rect2.h = i * 4; + rect2.y = param->gameHeight - (i * 4); + + SDL_RenderFillRect(renderer, &rect1); + SDL_RenderFillRect(renderer, &rect2); + } + + // Deja el renderizador como estaba + SDL_SetRenderTarget(renderer, temp); + + // Comprueba si ha terminado if ((counter * 4) > param->gameHeight) { finished = true; + a = 255; } break; } @@ -136,12 +107,14 @@ void Fade::update() { if (counter % fadeRandomSquaresDelay == 0) { - // Dibujamos sobre el backbuffer + // Dibuja sobre el backbuffer SDL_Texture *temp = SDL_GetRenderTarget(renderer); SDL_SetRenderTarget(renderer, backbuffer); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(renderer, r, g, b, a); + // Dibuja el cuadrado correspondiente - SDL_SetRenderDrawColor(renderer, r, g, b, 255); const int index = std::min(counter / fadeRandomSquaresDelay, (numSquaresWidth * numSquaresHeight) - 1); for (int i = 0; i < fadeRandomSquaresMult; ++i) { @@ -149,10 +122,13 @@ void Fade::update() SDL_RenderFillRect(renderer, &square[index2]); } - // Volvemos a usar el renderizador de forma normal + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + + // Deja el renderizador como estaba SDL_SetRenderTarget(renderer, temp); } + // Comprueba si ha terminado if (counter * fadeRandomSquaresMult / fadeRandomSquaresDelay >= numSquaresWidth * numSquaresHeight) { finished = true; @@ -166,17 +142,24 @@ void Fade::update() // Counter debe ir de 0 a 150 if (square.back().h < param->venetianSize) { + // Dibuja sobre el backbuffer + SDL_Texture *temp = SDL_GetRenderTarget(renderer); + SDL_SetRenderTarget(renderer, backbuffer); + + SDL_SetRenderDrawColor(renderer, r, g, b, a); + for (auto rect : square) + { + SDL_RenderFillRect(renderer, &rect); + } + + // Deja el renderizador como estaba + SDL_SetRenderTarget(renderer, temp); + const Uint8 h = counter / 3; for (int i = 0; i < (int)square.size(); ++i) { - if (i == 0) - { - square[i].h = h; - } - else - { - square[i].h = std::max(square[i - 1].h - 3, 0); - } + // A partir del segundo rectangulo se pinta en función del anterior + i == 0 ? square[i].h = h : square[i].h = std::max(square[i - 1].h - 3, 0); } } else @@ -190,14 +173,11 @@ void Fade::update() if (finished) { - if (postCounter == postDuration) - { - enabled = false; - } - else - { - postCounter++; - } + // Actualiza el contador + postCounter == postDuration ? enabled = false : postCounter++; + + // Deja el backbuffer todo del mismo color + cleanBackbuffer(r, g, b, a); } counter++; @@ -222,16 +202,8 @@ void Fade::activate() { case FADE_FULLSCREEN: { - // Dibujamos sobre el backbuffer - SDL_Texture *temp = SDL_GetRenderTarget(renderer); - SDL_SetRenderTarget(renderer, backbuffer); - - // Pintamos la textura con el color del fade - SDL_SetRenderDrawColor(renderer, r, g, b, 255); - SDL_RenderClear(renderer); - - // Vuelve a dejar el renderizador como estaba - SDL_SetRenderTarget(renderer, temp); + // Pinta el backbuffer de color sólido + cleanBackbuffer(r, g, b, 255); break; } @@ -239,6 +211,7 @@ void Fade::activate() { rect1 = {0, 0, param->gameWidth, 0}; rect2 = {0, 0, param->gameWidth, 0}; + a = 64; break; } @@ -269,11 +242,14 @@ void Fade::activate() // Limpia la textura SDL_Texture *temp = SDL_GetRenderTarget(renderer); SDL_SetRenderTarget(renderer, backbuffer); - const int alpha = mode == FADE_OUT ? 0 : 255; - SDL_SetRenderDrawColor(renderer, 0, 0, 0, alpha); + a = mode == FADE_OUT ? 0 : 255; + SDL_SetRenderDrawColor(renderer, r, g, b, a); SDL_RenderClear(renderer); SDL_SetRenderTarget(renderer, temp); + // Deja el color listo para usar + a = mode == FADE_OUT ? 255 : 0; + break; } @@ -281,6 +257,7 @@ void Fade::activate() { rect1 = {0, 0, param->gameWidth, 0}; square.clear(); + a = 255; // Añade los cuadrados al vector const int max = param->gameHeight / param->venetianSize; @@ -315,6 +292,12 @@ void Fade::setType(Uint8 type) this->type = type; } +// Establece el modo de fade +void Fade::setMode(Uint8 mode) +{ + this->mode = mode; +} + // Establece el color del fade void Fade::setColor(Uint8 r, Uint8 g, Uint8 b) { @@ -327,4 +310,19 @@ void Fade::setColor(Uint8 r, Uint8 g, Uint8 b) void Fade::setPost(int value) { postDuration = value; +} + +// Limpia el backbuffer +void Fade::cleanBackbuffer(int r, int g, int b, int a) +{ + // Dibujamos sobre el backbuffer + SDL_Texture *temp = SDL_GetRenderTarget(renderer); + SDL_SetRenderTarget(renderer, backbuffer); + + // Pintamos la textura con el color del fade + SDL_SetRenderDrawColor(renderer, r, g, b, a); + SDL_RenderClear(renderer); + + // Vuelve a dejar el renderizador como estaba + SDL_SetRenderTarget(renderer, temp); } \ No newline at end of file diff --git a/source/fade.h b/source/fade.h index b4f62fd..0b5c9b1 100644 --- a/source/fade.h +++ b/source/fade.h @@ -23,7 +23,7 @@ class Fade private: // Objetos y punteros SDL_Renderer *renderer; // El renderizador de la ventana - SDL_Texture *backbuffer; // Textura para usar como backbuffer + SDL_Texture *backbuffer; // Textura para usar como backbuffer con SDL_TEXTUREACCESS_TARGET // Variables Uint8 type; // Tipo de fade a realizar @@ -31,7 +31,7 @@ private: Uint16 counter; // Contador interno bool enabled; // Indica si el fade está activo bool finished; // Indica si ha terminado la transición - Uint8 r, g, b; // Colores para el fade + Uint8 r, g, b, a; // Colores para el fade SDL_Rect rect1; // Rectangulo usado para crear los efectos de transición SDL_Rect rect2; // Rectangulo usado para crear los efectos de transición int numSquaresWidth; // Cantidad total de cuadraditos en horizontal para el FADE_RANDOM_SQUARE @@ -42,10 +42,14 @@ private: int fadeRandomSquaresMult; // Cantidad de cuadrados que se pintaran cada vez int postDuration; // Duración posterior del fade tras finalizar int postCounter; // Contador para la duración posterior + Uint32 *pixels; // Array donde pintar los pixeles para la textura backbuffer2 con SDL_TEXTUREACCESS_STREAMING // Inicializa las variables void init(); + // Limpia el backbuffer + void cleanBackbuffer(int r, int g, int b, int a); + public: // Constructor Fade(SDL_Renderer *renderer, param_t *param); @@ -71,6 +75,9 @@ public: // Establece el tipo de fade void setType(Uint8 type); + // Establece el modo de fade + void setMode(Uint8 mode); + // Establece el color del fade void setColor(Uint8 r, Uint8 g, Uint8 b); diff --git a/source/game.cpp b/source/game.cpp index 829d65d..cd6e95f 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -296,6 +296,7 @@ void Game::init(int playerID) // Inicializa el objeto para el fundido fade->setColor(fadeColor.r, fadeColor.g, fadeColor.b); + fade->setPost(param->fadePostDuration); fade->setType(FADE_VENETIAN); // Con los globos creados, calcula el nivel de amenaza @@ -1554,7 +1555,6 @@ void Game::updatePlayers() { fade->setType(FADE_RANDOM_SQUARE); fade->activate(); - //section->name = SECTION_PROG_HI_SCORE_TABLE; } } } diff --git a/source/hiscore_table.cpp b/source/hiscore_table.cpp index 5ef7589..86a5d76 100644 --- a/source/hiscore_table.cpp +++ b/source/hiscore_table.cpp @@ -4,7 +4,7 @@ // Constructor HiScoreTable::HiScoreTable(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Lang *lang, param_t *param, options_t *options, section_t *section) { - // Copia los punteros + // Copia punteros this->renderer = renderer; this->screen = screen; this->asset = asset; @@ -14,23 +14,27 @@ HiScoreTable::HiScoreTable(SDL_Renderer *renderer, Screen *screen, Asset *asset, this->options = options; this->param = param; - // Reserva memoria para los punteros + // Objetos eventHandler = new SDL_Event(); - - // Fuente de texto para escribir + fade = new Fade(renderer, param); + background = new Background(renderer, screen, asset, param); text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer); // Crea un backbuffer para el renderizador backbuffer = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param->gameWidth, param->gameHeight); SDL_SetTextureBlendMode(backbuffer, SDL_BLENDMODE_BLEND); - // Crea el objeto para dibujar el fondo - background = new Background(renderer, screen, asset, param); + // Inicializa objetos background->setSrcDest(windowArea); background->setDstDest(windowArea); background->setCloudsSpeed(-0.5f); background->setGradientNumber(1); background->setTransition(0.8f); + fade->setColor(fadeColor.r, fadeColor.g, fadeColor.b); + fade->setType(FADE_RANDOM_SQUARE); + fade->setPost(param->fadePostDuration); + fade->setMode(FADE_IN); + fade->activate(); // Inicializa variables section->name = SECTION_PROG_HI_SCORE_TABLE; @@ -67,6 +71,8 @@ void HiScoreTable::update() // Actualiza el fondo background->update(); + fade->update(); + counter++; if (counter == counterEnd) @@ -134,6 +140,8 @@ void HiScoreTable::render() // Copia el backbuffer al renderizador SDL_RenderCopy(renderer, backbuffer, nullptr, &viewArea); + fade->render(); + // Vuelca el contenido del renderizador en pantalla screen->blit(); } diff --git a/source/hiscore_table.h b/source/hiscore_table.h index 7524167..c487150 100644 --- a/source/hiscore_table.h +++ b/source/hiscore_table.h @@ -10,6 +10,7 @@ #include "common/utils.h" #include "const.h" #include "lang.h" +#include "fade.h" #include "background.h" #ifndef HISCORE_TABLE_H @@ -28,6 +29,7 @@ private: Input *input; // Objeto pata gestionar la entrada Background *background; // Objeto para dibujar el fondo del juego Lang *lang; // Objeto para gestionar los textos en diferentes idiomas + Fade *fade; // Objeto para renderizar fades Text *text; // Objeto para escribir texto options_t *options; // Opciones y parametros del programa section_t *section; // Estado del bucle principal para saber si continua o se sale