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

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;
}

View File

@@ -10,9 +10,21 @@ class Surface; // Declaración adelantada de la clase Surface
class Logo
{
private:
enum class LogoState
{
BLACK,
LINES,
COMPLETE,
END
};
Uint64 ticks = 0; // Contador de ticks para medir el tiempo o controlar animaciones
std::shared_ptr<Surface> logo_surface = nullptr; // Superficie del logotipo, compartida entre múltiples objetos
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;
// Métodos privados para manejar el ciclo de vida y la lógica del logotipo
void init(); // Inicializa los recursos necesarios para el logotipo
@@ -21,6 +33,11 @@ private:
void update(); // Actualiza el estado del logotipo (animaciones, lógica, etc.)
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);
public:
Logo(); // Constructor: Inicializa la clase Logo
~Logo(); // Destructor: Limpia los recursos utilizados por la clase Logo

View File

@@ -171,12 +171,6 @@ void Surface::loadPalette(Palette palette)
palette_ = palette;
}
// Establece un color en la paleta
void Surface::setColor(int index, Uint32 color)
{
palette_.at(index) = color;
}
// Rellena la superficie con un color
void Surface::clear(Uint8 color)
{

View File

@@ -1,15 +1,16 @@
#pragma once
#include <SDL3/SDL_rect.h> // for SDL_Rect, SDL_FRect
#include <SDL3/SDL_render.h> // for SDL_Renderer, SDL_Texture
#include <SDL3/SDL_stdinc.h> // for Uint8, Uint16, Uint32
#include <SDL3/SDL_surface.h> // for SDL_FlipMode
#include <array> // for array
#include <memory> // for default_delete, shared_ptr, __shared_p...
#include <numeric> // for iota
#include <stdexcept> // for invalid_argument
#include <string> // for string
#include <utility> // for move
#include <SDL3/SDL_rect.h> // for SDL_Rect, SDL_FRect
#include <SDL3/SDL_render.h> // for SDL_Renderer, SDL_Texture
#include <SDL3/SDL_stdinc.h> // for Uint8, Uint16, Uint32
#include <SDL3/SDL_surface.h> // for SDL_FlipMode
#include <array> // for array
#include <memory> // for default_delete, shared_ptr, __shared_p...
#include <numeric> // for iota
#include <stdexcept> // for invalid_argument
#include <string> // for string
#include <utility> // for move
#include <algorithm>
// Alias
using Palette = std::array<Uint32, 256>;
@@ -110,6 +111,9 @@ public:
void loadPalette(const std::string &file_path);
void loadPalette(Palette palette);
// Obtiene la paleta
Palette &getPalette() { return palette_; }
// Copia una región de la SurfaceData de origen a la SurfaceData de destino
void render(int dx, int dy, int sx, int sy, int w, int h);
void render(int x, int y, SDL_Rect *clip = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);
@@ -118,9 +122,6 @@ public:
// Copia una región de la SurfaceData de origen a la SurfaceData de destino reemplazando un color por otro
void renderWithColorReplace(int x, int y, Uint8 source_color = 0, Uint8 target_color = 0, SDL_Rect *srcRect = nullptr, SDL_FlipMode flip = SDL_FLIP_NONE);
// Establece un color en la paleta
void setColor(int index, Uint32 color);
// Rellena la SurfaceData con un color
void clear(Uint8 color);
@@ -159,6 +160,9 @@ public:
Uint8 getTransparentColor() const { return transparent_color_; }
void setTransparentColor(Uint8 color = 255) { transparent_color_ = color; }
// Establece un color en la paleta
void setColor(int color, Uint32 value) { palette_.at(std::clamp(color, 0, 255)) = value; }
// Paleta
void setPalette(const std::array<Uint32, 256> &palette) { palette_ = palette; }