afegit efecte de flash
This commit is contained in:
109
source/logo.cpp
109
source/logo.cpp
@@ -101,9 +101,10 @@ void Logo::update()
|
||||
// Método privado para renderizar el logotipo en pantalla
|
||||
void Logo::render()
|
||||
{
|
||||
Screen::get()->start(); // Inicia el proceso de renderizado
|
||||
logo_sprite->render(); // Renderiza el sprite del logotipo
|
||||
Screen::get()->render(); // Finaliza el renderizado
|
||||
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
|
||||
}
|
||||
|
||||
// Método principal que ejecuta el ciclo de vida del logotipo
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -34,9 +37,11 @@ private:
|
||||
void render(); // Renderiza el logotipo en pantalla
|
||||
|
||||
// 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);
|
||||
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); // 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
|
||||
|
||||
Reference in New Issue
Block a user