From e2bb20052ccf37dc1e75df8d112777a4ffe0e39f Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 15 Sep 2022 21:08:14 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adido=20efecto=20b=C3=A1sico=20de=20fade?= =?UTF-8?q?=20a=20la=20clase=20screen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/fade.cpp | 158 ---------------------------------------------- source/fade.h | 58 ----------------- source/game.cpp | 4 ++ source/screen.cpp | 67 +++++++++++++++++++- source/screen.h | 24 +++++++ 5 files changed, 94 insertions(+), 217 deletions(-) delete mode 100644 source/fade.cpp delete mode 100644 source/fade.h diff --git a/source/fade.cpp b/source/fade.cpp deleted file mode 100644 index f22b29b..0000000 --- a/source/fade.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include "fade.h" -#include "const.h" - -// Constructor -Fade::Fade(SDL_Renderer *renderer) -{ - renderer = renderer; - - backbuffer = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT); - if (backbuffer == nullptr) - printf("Backbuffer could not be created!\nSDL Error: %s\n", SDL_GetError()); -} - -// Destructor -Fade::~Fade() -{ - SDL_DestroyTexture(backbuffer); - backbuffer = nullptr; -} - -// Inicializa las variables -void Fade::init(color_t color) -{ - fadeType = FADE_CENTER; - enabled = false; - finished = false; - counter = 0; - this->color = color; -} - -// Pinta una transición en pantalla -void Fade::render() -{ - if (enabled && !finished) - { - switch (fadeType) - { - case FADE_FULLSCREEN: - rect1 = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; - - for (int i = 0; i < 256; i += 4) - { - // Dibujamos sobre el renderizador - SDL_SetRenderTarget(renderer, nullptr); - - // Copia el backbuffer con la imagen que había al renderizador - SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); - - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, i); - SDL_RenderFillRect(renderer, &rect1); - - // Vuelca el renderizador en pantalla - SDL_RenderPresent(renderer); - } - - // Deja todos los buffers del mismo color - SDL_SetRenderTarget(renderer, backbuffer); - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 255); - SDL_RenderClear(renderer); - - SDL_SetRenderTarget(renderer, nullptr); - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 255); - SDL_RenderClear(renderer); - break; - - case FADE_CENTER: - rect1 = {0, 0, GAMECANVAS_WIDTH, 0}; - rect2 = {0, 0, GAMECANVAS_WIDTH, 0}; - - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 64); - - for (int i = 0; i < counter; i++) - { - rect1.h = rect2.h = i * 4; - rect2.y = GAMECANVAS_HEIGHT - (i * 4); - - SDL_RenderFillRect(renderer, &rect1); - SDL_RenderFillRect(renderer, &rect2); - } - - if ((counter * 4) > GAMECANVAS_HEIGHT) - finished = true; - break; - - case FADE_RANDOM_SQUARE: - rect1 = {0, 0, 32, 32}; - - for (Uint16 i = 0; i < 50; i++) - { - // Crea un color al azar - color.r = 255 * (rand() % 2); - color.g = 255 * (rand() % 2); - color.b = 255 * (rand() % 2); - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 64); - - // Dibujamos sobre el backbuffer - SDL_SetRenderTarget(renderer, backbuffer); - - rect1.x = rand() % (GAMECANVAS_WIDTH - rect1.w); - rect1.y = rand() % (GAMECANVAS_HEIGHT - rect1.h); - SDL_RenderFillRect(renderer, &rect1); - - // Volvemos a usar el renderizador de forma normal - SDL_SetRenderTarget(renderer, nullptr); - - // Copiamos el backbuffer al renderizador - SDL_RenderCopy(renderer, backbuffer, nullptr, nullptr); - - // Volcamos el renderizador en pantalla - SDL_RenderPresent(renderer); - SDL_Delay(100); - } - break; - - default: - break; - } - } - - if (finished) - { - SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 255); - SDL_RenderClear(renderer); - } -} - -// Actualiza las variables internas -void Fade::update() -{ - if (enabled) - counter++; -} - -// Activa el fade -void Fade::activateFade() -{ - enabled = true; - finished = false; - counter = 0; -} - -// Comprueba si está activo -bool Fade::isEnabled() -{ - return enabled; -} - -// Comprueba si ha terminado la transicion -bool Fade::hasEnded() -{ - return finished; -} - -// Establece el tipo de fade -void Fade::setFadeType(int fadeType) -{ - fadeType = fadeType; -} \ No newline at end of file diff --git a/source/fade.h b/source/fade.h deleted file mode 100644 index 93cead7..0000000 --- a/source/fade.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include -#include "ltexture.h" -#include "utils.h" - -#ifndef FADE_H -#define FADE_H - -// Tipos de fundido -#define FADE_FULLSCREEN 0 -#define FADE_CENTER 1 -#define FADE_RANDOM_SQUARE 2 - -// Clase Fade -class Fade -{ -private: - SDL_Renderer *renderer; // El renderizador de la ventana - SDL_Texture *backbuffer; // Textura para usar como backbuffer - Uint8 fadeType; // Tipo de fade a realizar - Uint16 counter; // Contador interno - bool enabled; // Indica si el fade está activo - bool finished; // Indica si ha terminado la transición - color_t color; // 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 - -public: - // Constructor - Fade(SDL_Renderer *renderer); - - // Destructor - ~Fade(); - - // Inicializa las variables - void init(color_t color); - - // Pinta una transición en pantalla - void render(); - - // Actualiza las variables internas - void update(); - - // Activa el fade - void activateFade(); - - // Comprueba si ha terminado la transicion - bool hasEnded(); - - // Comprueba si está activo - bool isEnabled(); - - // Establece el tipo de fade - void setFadeType(int fadeType); -}; - -#endif \ No newline at end of file diff --git a/source/game.cpp b/source/game.cpp index 7a1f093..a3f66ff 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -112,6 +112,7 @@ void Game::checkEventHandler() case SDL_SCANCODE_M: board.music = !board.music; board.music ? JA_ResumeMusic() : JA_PauseMusic(); + screen->setFade(); break; case SDL_SCANCODE_P: @@ -214,8 +215,10 @@ void Game::update() checkIfPlayerIsAlive(); checkEndGame(); scoreboard->update(); + updateDebugInfo(); updateBlackScreen(); + screen->updateFX(); } } @@ -237,6 +240,7 @@ void Game::render() // Debug info renderDebugInfo(); // test->render(); + screen->renderFX(); // Actualiza la pantalla screen->blit(); diff --git a/source/screen.cpp b/source/screen.cpp index 69ea685..925bc1e 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -13,6 +13,10 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, options_t *options, i gameCanvasWidth = gameInternalResX; gameCanvasHeight = gameInternalResY; + fade = false; + fadeCounter = 0; + fadeLenght = 200; + // Define el color del borde para el modo de pantalla completa borderColor = {0x00, 0x00, 0x00}; @@ -164,7 +168,7 @@ void Screen::switchVideoMode() { options->fullScreenMode = 0; } - + setVideoMode(options->fullScreenMode); } @@ -204,4 +208,65 @@ void Screen::switchBorder() { options->borderEnabled = !options->borderEnabled; setVideoMode(0); +} + +// Activa el fade +void Screen::setFade() +{ + fade = true; +} + +// Comprueba si ha terminado el fade +bool Screen::fadeEnded() +{ + if (fade || fadeCounter > 0) + { + return false; + } + + return true; +} + +// Actualiza el fade +void Screen::updateFade() +{ + if (!fade) + { + return; + } + + fadeCounter++; + if (fadeCounter > fadeLenght) + { + fade = false; + fadeCounter = 0; + } +} + +// Dibuja el fade +void Screen::renderFade() +{ + if (!fade) + { + return; + } + + const SDL_Rect rect = {0, 0, gameCanvasWidth, gameCanvasHeight}; + color_t color = {0, 0, 0}; + const float step = (float)fadeCounter / (float)fadeLenght; + const int alpha = 0 + (255 - 0) * step; + SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, alpha); + SDL_RenderFillRect(renderer, &rect); +} + +// Actualiza los efectos +void Screen::updateFX() +{ + updateFade(); +} + +// Dibuja los efectos +void Screen::renderFX() +{ + renderFade(); } \ No newline at end of file diff --git a/source/screen.h b/source/screen.h index f7a927b..a86235c 100644 --- a/source/screen.h +++ b/source/screen.h @@ -36,6 +36,17 @@ private: SDL_Rect dest; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana color_t borderColor; // Color del borde añadido a la textura de juego para rellenar la pantalla + // EFECTOS + bool fade; // Indica si esta activo el efecto de fade + int fadeCounter; // Temporizador para el efecto de fade + int fadeLenght; // Duración del fade + + // Actualiza el fade + void updateFade(); + + // Dibuja el fade + void renderFade(); + public: // Constructor Screen(SDL_Window *window, SDL_Renderer *renderer, options_t *options, int gameInternalResX, int gameInternalResY); @@ -75,6 +86,19 @@ public: // Cambia entre borde visible y no visible void switchBorder(); + + // Activa el fade + void setFade(); + + // Comprueba si ha terminado el fade + bool fadeEnded(); + + // Actualiza los efectos + void updateFX(); + + //Dibuja los efectos + void renderFX(); + }; #endif