diff --git a/source/logo.cpp b/source/logo.cpp index 00a7fea..24e0d3d 100644 --- a/source/logo.cpp +++ b/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; -} \ No newline at end of file + 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(PERCENT_UP * maxSteps); + int stepHold = static_cast(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; +} diff --git a/source/logo.h b/source/logo.h index f81cfda..e6058c9 100644 --- a/source/logo.h +++ b/source/logo.h @@ -14,6 +14,7 @@ private: { BLACK, LINES, + FLASH, COMPLETE, END }; @@ -23,8 +24,10 @@ private: std::unique_ptr 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