afegit efecte de flash

This commit is contained in:
2025-04-08 13:31:09 +02:00
parent dfe493b87d
commit 7b646b100b
2 changed files with 108 additions and 16 deletions

View File

@@ -102,6 +102,7 @@ void Logo::update()
void Logo::render()
{
Screen::get()->start(); // Inicia el proceso de renderizado
Screen::get()->clearSurface(0); // Limpia la superficie
logo_sprite->render(); // Renderiza el sprite del logotipo
Screen::get()->render(); // Finaliza el renderizado
}
@@ -138,19 +139,35 @@ void Logo::updateState()
{
state = LogoState::LINES;
init_time = SDL_GetTicks();
steps[69] = 1;
initSteps();
}
break;
case LogoState::LINES:
elapsed_time = SDL_GetTicks() - init_time;
if (elapsed_time > 50)
if (elapsed_time > 20)
{
init_time = SDL_GetTicks();
if (advancePaletteStep(70, steps, max_step))
{
state = LogoState::FLASH;
}
}
break;
case LogoState::FLASH:
elapsed_time = SDL_GetTicks() - init_time;
if (elapsed_time > 5)
{
init_time = SDL_GetTicks();
if (flashPalette(flash_step, max_flash_step))
{
state = LogoState::COMPLETE;
}
else
{
++flash_step;
}
}
break;
@@ -158,7 +175,9 @@ void Logo::updateState()
elapsed_time = SDL_GetTicks() - init_time;
if (elapsed_time > 5000)
{
state = LogoState::END;
state = LogoState::BLACK;
init_time = SDL_GetTicks();
blackOutPalette();
}
break;
@@ -173,7 +192,7 @@ void Logo::updateState()
bool Logo::advancePaletteStep(int size, int steps[], int max_step)
{
bool allDone = true;
bool all_done = true;
for (int i = 1; i < size; ++i)
{
@@ -189,7 +208,7 @@ bool Logo::advancePaletteStep(int size, int steps[], int max_step)
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000 | (intensity << 16) | (intensity << 8) | intensity);
}
if (i < size - 1 && steps[i + 1] >= 2 && steps[i] == 0)
if (i < size - 1 && steps[i + 1] >= 1 && steps[i] == 0)
{
// Inicia el paso de este color si el siguiente ha avanzado al menos dos pasos
steps[i] = 1;
@@ -198,9 +217,77 @@ bool Logo::advancePaletteStep(int size, int steps[], int max_step)
if (steps[i] < max_step)
{
allDone = false;
all_done = false;
}
}
return allDone;
return all_done;
}
void Logo::initSteps()
{
std::fill(std::begin(steps), std::end(steps), 0);
steps[69] = 1;
flash_step = 0;
}
// Modifica los colores de la paleta para simular un flash
bool Logo::flashPalette(int step, int maxSteps)
{
// Constantes para ajustar los porcentajes (en función de maxSteps)
const float PERCENT_UP = 0.05f;
const float PERCENT_HOLD = 0.3f;
bool all_done = true;
// Calcula los límites de cada fase basados en los porcentajes
int stepUp = static_cast<int>(PERCENT_UP * maxSteps);
int stepHold = static_cast<int>(PERCENT_HOLD * maxSteps) + stepUp;
int stepDown = maxSteps; // La bajada ocupa el resto de los pasos
// Calcula la intensidad según el paso actual
int intensity = 0;
if (step <= stepUp)
{
// Subida: incrementa la intensidad linealmente
intensity = (step * 255) / stepUp;
}
else if (step <= stepHold)
{
// Mantenimiento: intensidad máxima
intensity = 255;
}
else if (step <= stepDown)
{
// Bajada: decrementa la intensidad más lentamente
int adjustedStep = step - stepHold; // Ajustamos el paso relativo a la bajada
intensity = 255 - (adjustedStep * 255) / (stepDown - stepHold);
}
// Clampea la intensidad para garantizar que esté entre 0 y 255
intensity = std::clamp(intensity, 0, 255);
// Calcula los colores para el efecto de flash
Uint32 color0 = 0xFF000000 | (intensity << 16) | (intensity << 8) | intensity;
Uint32 inverseColor = 0xFF000000 | ((255 - intensity) << 16) | ((255 - intensity) << 8) | (255 - intensity);
// Aplica los colores calculados
Screen::get()->getRendererSurface()->setColor(0, color0);
for (int i = 1; i < 70; ++i)
{
Screen::get()->getRendererSurface()->setColor(i, inverseColor);
}
// Comprueba si hemos completado todos los pasos
if (step >= maxSteps)
{
all_done = true; // Animación completada
}
else
{
all_done = false; // Aún quedan pasos pendientes
}
return all_done;
}

View File

@@ -14,6 +14,7 @@ private:
{
BLACK,
LINES,
FLASH,
COMPLETE,
END
};
@@ -23,8 +24,10 @@ private:
std::unique_ptr<SSprite> logo_sprite = nullptr; // Sprite del logotipo, propiedad exclusiva de esta clase
LogoState state = LogoState::BLACK; // Gestiona los estados del logo
Uint64 init_time = 0, elapsed_time = 0; // Para medir el tiempo transcurrido
int steps[70] = {0};
int max_step = 8;
int steps[70] = {0}; // Lleva la cuenta del paso en el que se encuentra cada color de la paleta
int max_step = 8; // Cantidad total de pasos para el efecto de paleta del borde de las letras
int flash_step = 0; // Paso en el que se encuentra el flash final
int max_flash_step = 48; // Cantidad de pasos para efectuar el flash del final
// Métodos privados para manejar el ciclo de vida y la lógica del logotipo
void init(); // Inicializa los recursos necesarios para el logotipo
@@ -36,7 +39,9 @@ private:
// Métodos específicos
void blackOutPalette(); // Transforma todos los colores de la paleta a negro
void updateState(); // Gestiona los diferentes estados del logo
bool advancePaletteStep(int size, int steps[], int maxStep);
bool advancePaletteStep(int size, int steps[], int maxStep); // Pasa los colores de la paleta de negro a blanco
void initSteps(); // Inicializa las variables para gestionar los pasos en que se encuentran las animaciones de paleta
bool flashPalette(int step, int max_steps); // Modifica los colores de la paleta para simular un flash
public:
Logo(); // Constructor: Inicializa la clase Logo