afegit efecte de flash
This commit is contained in:
107
source/logo.cpp
107
source/logo.cpp
@@ -101,9 +101,10 @@ void Logo::update()
|
|||||||
// Método privado para renderizar el logotipo en pantalla
|
// Método privado para renderizar el logotipo en pantalla
|
||||||
void Logo::render()
|
void Logo::render()
|
||||||
{
|
{
|
||||||
Screen::get()->start(); // Inicia el proceso de renderizado
|
Screen::get()->start(); // Inicia el proceso de renderizado
|
||||||
logo_sprite->render(); // Renderiza el sprite del logotipo
|
Screen::get()->clearSurface(0); // Limpia la superficie
|
||||||
Screen::get()->render(); // Finaliza el renderizado
|
logo_sprite->render(); // Renderiza el sprite del logotipo
|
||||||
|
Screen::get()->render(); // Finaliza el renderizado
|
||||||
}
|
}
|
||||||
|
|
||||||
// Método principal que ejecuta el ciclo de vida del logotipo
|
// Método principal que ejecuta el ciclo de vida del logotipo
|
||||||
@@ -138,19 +139,35 @@ void Logo::updateState()
|
|||||||
{
|
{
|
||||||
state = LogoState::LINES;
|
state = LogoState::LINES;
|
||||||
init_time = SDL_GetTicks();
|
init_time = SDL_GetTicks();
|
||||||
steps[69] = 1;
|
initSteps();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LogoState::LINES:
|
case LogoState::LINES:
|
||||||
elapsed_time = SDL_GetTicks() - init_time;
|
elapsed_time = SDL_GetTicks() - init_time;
|
||||||
if (elapsed_time > 50)
|
if (elapsed_time > 20)
|
||||||
{
|
{
|
||||||
init_time = SDL_GetTicks();
|
init_time = SDL_GetTicks();
|
||||||
if (advancePaletteStep(70, steps, max_step))
|
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;
|
state = LogoState::COMPLETE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++flash_step;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -158,7 +175,9 @@ void Logo::updateState()
|
|||||||
elapsed_time = SDL_GetTicks() - init_time;
|
elapsed_time = SDL_GetTicks() - init_time;
|
||||||
if (elapsed_time > 5000)
|
if (elapsed_time > 5000)
|
||||||
{
|
{
|
||||||
state = LogoState::END;
|
state = LogoState::BLACK;
|
||||||
|
init_time = SDL_GetTicks();
|
||||||
|
blackOutPalette();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -173,7 +192,7 @@ void Logo::updateState()
|
|||||||
|
|
||||||
bool Logo::advancePaletteStep(int size, int steps[], int max_step)
|
bool Logo::advancePaletteStep(int size, int steps[], int max_step)
|
||||||
{
|
{
|
||||||
bool allDone = true;
|
bool all_done = true;
|
||||||
|
|
||||||
for (int i = 1; i < size; ++i)
|
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);
|
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
|
// Inicia el paso de este color si el siguiente ha avanzado al menos dos pasos
|
||||||
steps[i] = 1;
|
steps[i] = 1;
|
||||||
@@ -198,9 +217,77 @@ bool Logo::advancePaletteStep(int size, int steps[], int max_step)
|
|||||||
|
|
||||||
if (steps[i] < 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;
|
||||||
}
|
}
|
||||||
@@ -14,6 +14,7 @@ private:
|
|||||||
{
|
{
|
||||||
BLACK,
|
BLACK,
|
||||||
LINES,
|
LINES,
|
||||||
|
FLASH,
|
||||||
COMPLETE,
|
COMPLETE,
|
||||||
END
|
END
|
||||||
};
|
};
|
||||||
@@ -23,8 +24,10 @@ private:
|
|||||||
std::unique_ptr<SSprite> logo_sprite = nullptr; // Sprite del logotipo, propiedad exclusiva de esta clase
|
std::unique_ptr<SSprite> logo_sprite = nullptr; // Sprite del logotipo, propiedad exclusiva de esta clase
|
||||||
LogoState state = LogoState::BLACK; // Gestiona los estados del logo
|
LogoState state = LogoState::BLACK; // Gestiona los estados del logo
|
||||||
Uint64 init_time = 0, elapsed_time = 0; // Para medir el tiempo transcurrido
|
Uint64 init_time = 0, elapsed_time = 0; // Para medir el tiempo transcurrido
|
||||||
int steps[70] = {0};
|
int steps[70] = {0}; // Lleva la cuenta del paso en el que se encuentra cada color de la paleta
|
||||||
int max_step = 8;
|
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
|
// Métodos privados para manejar el ciclo de vida y la lógica del logotipo
|
||||||
void init(); // Inicializa los recursos necesarios para el logotipo
|
void init(); // Inicializa los recursos necesarios para el logotipo
|
||||||
@@ -34,9 +37,11 @@ private:
|
|||||||
void render(); // Renderiza el logotipo en pantalla
|
void render(); // Renderiza el logotipo en pantalla
|
||||||
|
|
||||||
// Métodos específicos
|
// Métodos específicos
|
||||||
void blackOutPalette(); // Transforma todos los colores de la paleta a negro
|
void blackOutPalette(); // Transforma todos los colores de la paleta a negro
|
||||||
void updateState(); // Gestiona los diferentes estados del logo
|
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:
|
public:
|
||||||
Logo(); // Constructor: Inicializa la clase Logo
|
Logo(); // Constructor: Inicializa la clase Logo
|
||||||
|
|||||||
Reference in New Issue
Block a user