Añadido efecto de flash a la clase Screen

This commit is contained in:
2024-06-11 15:42:56 +02:00
parent ee174762e6
commit 27294125fe
5 changed files with 88 additions and 32 deletions

View File

@@ -20,9 +20,14 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options
borderHeight = options->video.border.height * 2;
dest = {0, 0, 0, 0};
borderColor = {0, 0, 0};
fade = 0;
fadeCounter = 0;
fadeLenght = 0;
fade.enabled = false;
fade.counter = 0;
fade.lenght = 0;
fade.color = {0xFF, 0xFF, 0xFF};
flash.enabled = false;
flash.counter = 0;
flash.lenght = 0;
flash.color = {0xFF, 0xFF, 0xFF};
shake.desp = 1;
shake.delay = 3;
shake.counter = 0;
@@ -64,6 +69,9 @@ void Screen::start()
// Vuelca el contenido del renderizador en pantalla
void Screen::blit()
{
// Actualiza y dibuja el efecto de flash en la pantalla
doFlash();
// Vuelve a dejar el renderizador en modo normal
SDL_SetRenderTarget(renderer, nullptr);
@@ -241,13 +249,13 @@ void Screen::switchBorder()
// Activa el fade
void Screen::setFade()
{
fade = true;
fade.enabled = true;
}
// Comprueba si ha terminado el fade
bool Screen::fadeEnded()
{
if (fade || fadeCounter > 0)
if (fade.enabled || fade.counter > 0)
{
return false;
}
@@ -258,21 +266,21 @@ bool Screen::fadeEnded()
// Inicializa las variables para el fade
void Screen::iniFade()
{
fade = false;
fadeCounter = 0;
fadeLenght = 200;
fade.enabled = false;
fade.counter = 0;
fade.lenght = 200;
}
// Actualiza el fade
void Screen::updateFade()
{
if (!fade)
if (!fade.enabled)
{
return;
}
fadeCounter++;
if (fadeCounter > fadeLenght)
fade.counter++;
if (fade.counter > fade.lenght)
{
iniFade();
}
@@ -281,14 +289,14 @@ void Screen::updateFade()
// Dibuja el fade
void Screen::renderFade()
{
if (!fade)
if (!fade.enabled)
{
return;
}
const SDL_Rect rect = {0, 0, gameCanvasWidth, gameCanvasHeight};
color_t color = {0, 0, 0};
const float step = (float)fadeCounter / (float)fadeLenght;
const float step = (float)fade.counter / (float)fade.lenght;
const int alpha = 0 + (255 - 0) * step;
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, alpha);
SDL_RenderFillRect(renderer, &rect);
@@ -310,10 +318,11 @@ void Screen::renderFX()
void Screen::update()
{
updateShake();
// updateFlash();
}
// Agita la pantalla
void Screen::startShake()
void Screen::setShake()
{
shake.remaining = shake.lenght;
shake.counter = shake.delay;
@@ -341,4 +350,37 @@ void Screen::updateShake()
{
dest.x = shake.origin;
}
}
// Pone la pantalla de color
void Screen::setFlash(color_t color, int lenght)
{
flash.enabled = true;
flash.counter = 0;
flash.lenght = lenght;
flash.color = color;
}
// Actualiza y dibuja el efecto de flash en la pantalla
void Screen::doFlash()
{
if (flash.enabled)
{
// Dibuja el color del flash en la textura
SDL_Texture *temp = SDL_GetRenderTarget(renderer);
SDL_SetRenderTarget(renderer, gameCanvas);
SDL_SetRenderDrawColor(renderer, flash.color.r, flash.color.g, flash.color.b, 0xFF);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, temp);
// Actualiza la lógica del efecto
if (flash.counter < flash.lenght)
{
flash.counter++;
}
else
{
flash.enabled = false;
}
}
}

View File

@@ -32,10 +32,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
struct effect_t
{
bool enabled; // Indica si el efecto está activo
int counter; // Contador para el efecto
int lenght; // Duración del efecto
color_t color; // Color del efecto
};
// Variables - 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
effect_t fade; // Variable para gestionar el efecto de fade
effect_t flash; // Variable para gestionar el efecto de flash
struct shake_t
{
@@ -65,6 +72,9 @@ private:
// Actualiza la logica para agitar la pantalla
void updateShake();
// Actualiza y dibuja el efecto de flash en la pantalla
void doFlash();
public:
// Constructor
Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options);
@@ -122,7 +132,10 @@ public:
bool fadeEnded();
// Agita la pantalla
void startShake();
void setShake();
// Pone la pantalla de color
void setFlash(color_t color, int lenght);
};
#endif