animació completada

This commit is contained in:
2025-04-08 10:03:15 +02:00
parent b6682fe7ff
commit dfe493b87d
5 changed files with 139 additions and 30 deletions
+105 -11
View File
@@ -1,14 +1,14 @@
#include "logo.h"
#include <SDL3/SDL_events.h> // Manejo de eventos de SDL (teclado, ratón, etc.)
#include <SDL3/SDL_init.h> // Inicialización y limpieza de SDL
#include <SDL3/SDL_log.h> // Manejo de logs en SDL
#include <SDL3/SDL_timer.h> // Funciones de temporización de SDL
#include "global_inputs.h" // Funciones para manejar entradas globales
#include "mouse.h" // Manejo de eventos del ratón
#include "options.h" // Configuración global de opciones
#include "s_sprite.h" // Clase para manejar sprites
#include "screen.h" // Clase para manejar la pantalla
#include "surface.h" // Clase para manejar superficies
#include <SDL3/SDL_events.h> // Manejo de eventos de SDL (teclado, ratón, etc.)
#include <SDL3/SDL_init.h> // Inicialización y limpieza de SDL
#include <SDL3/SDL_log.h> // Manejo de logs en SDL
#include <SDL3/SDL_timer.h> // Funciones de temporización de SDL
#include "global_inputs.h" // Funciones para manejar entradas globales
#include "mouse.h" // Manejo de eventos del ratón
#include "options.h" // Configuración global de opciones
#include "s_sprite.h" // Clase para manejar sprites
#include "screen.h" // Clase para manejar la pantalla
#include "surface.h" // Clase para manejar superficies
// Constructor de la clase Logo: inicializa los recursos necesarios
Logo::Logo()
@@ -35,6 +35,7 @@ void Logo::init()
// Carga la superficie del logotipo desde un archivo y la escala
logo_surface = std::make_shared<Surface>("jailgames.gif");
logo_surface->setTransparentColor(0);
blackOutPalette();
// Crea el sprite del logotipo y lo posiciona en el centro de la pantalla
logo_sprite = std::make_unique<SSprite>(logo_surface);
@@ -42,6 +43,9 @@ void Logo::init()
(options.logo.width - logo_sprite->getWidth()) / 2,
(options.logo.height - logo_sprite->getHeight()) / 2);
// Inicia el contador de tiempo
init_time = SDL_GetTicks();
// Log de inicio del logotipo
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Logo start");
}
@@ -67,7 +71,7 @@ void Logo::checkEvents()
{
switch (event.type)
{
case SDL_EVENT_QUIT: // Evento de salida (cerrar la ventana)
case SDL_EVENT_QUIT: // Evento de salida (cerrar la ventana)
options.logo.running = false; // Detiene el bucle principal
return;
}
@@ -88,6 +92,9 @@ void Logo::update()
// Actualiza la pantalla
Screen::get()->update();
// Gestiona los diferentes estados del logo
updateState();
}
}
@@ -109,4 +116,91 @@ int Logo::run()
render(); // Renderiza el logotipo
}
return 0; // Devuelve 0 al finalizar
}
// Transforma todos los colores de la paleta a negro
void Logo::blackOutPalette()
{
for (int i = 1; i < 256; ++i)
{
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000);
}
}
// Gestiona los diferentes estados del logo
void Logo::updateState()
{
switch (state)
{
case LogoState::BLACK:
elapsed_time = SDL_GetTicks() - init_time;
if (elapsed_time > 2000)
{
state = LogoState::LINES;
init_time = SDL_GetTicks();
steps[69] = 1;
}
break;
case LogoState::LINES:
elapsed_time = SDL_GetTicks() - init_time;
if (elapsed_time > 50)
{
init_time = SDL_GetTicks();
if (advancePaletteStep(70, steps, max_step))
{
state = LogoState::COMPLETE;
}
}
break;
case LogoState::COMPLETE:
elapsed_time = SDL_GetTicks() - init_time;
if (elapsed_time > 5000)
{
state = LogoState::END;
}
break;
case LogoState::END:
options.logo.running = false;
break;
default:
break;
}
}
bool Logo::advancePaletteStep(int size, int steps[], int max_step)
{
bool allDone = true;
for (int i = 1; i < size; ++i)
{
if (steps[i] > 0 && steps[i] < max_step)
{
// Avanza un paso
steps[i]++;
// Calcula la intensidad del color
int intensity = (steps[i] * 256) / max_step;
if (intensity > 255)
intensity = 255;
// Actualiza el color al nuevo valor en formato ARGB
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000 | (intensity << 16) | (intensity << 8) | intensity);
}
if (i < size - 1 && steps[i + 1] >= 2 && steps[i] == 0)
{
// Inicia el paso de este color si el siguiente ha avanzado al menos dos pasos
steps[i] = 1;
Screen::get()->getRendererSurface()->setColor(i, 0xFF000000 | (64 << 16) | (64 << 8) | 64); // Paso inicial
}
if (steps[i] < max_step)
{
allDone = false;
}
}
return allDone;
}