diff --git a/source/fade.cpp b/source/fade.cpp new file mode 100644 index 0000000..f22b29b --- /dev/null +++ b/source/fade.cpp @@ -0,0 +1,158 @@ +#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 new file mode 100644 index 0000000..93cead7 --- /dev/null +++ b/source/fade.h @@ -0,0 +1,58 @@ +#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