diff --git a/jailgames.gif b/jailgames.gif index 5b91354..a1d8048 100644 Binary files a/jailgames.gif and b/jailgames.gif differ diff --git a/source/logo.cpp b/source/logo.cpp index 8fa41d8..00a7fea 100644 --- a/source/logo.cpp +++ b/source/logo.cpp @@ -1,14 +1,14 @@ #include "logo.h" -#include // Manejo de eventos de SDL (teclado, ratón, etc.) -#include // Inicialización y limpieza de SDL -#include // Manejo de logs en SDL -#include // 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 // Manejo de eventos de SDL (teclado, ratón, etc.) +#include // Inicialización y limpieza de SDL +#include // Manejo de logs en SDL +#include // 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("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(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; } \ No newline at end of file diff --git a/source/logo.h b/source/logo.h index 779102a..f81cfda 100644 --- a/source/logo.h +++ b/source/logo.h @@ -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 logo_surface = nullptr; // Superficie del logotipo, compartida entre múltiples objetos 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; // 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 diff --git a/source/surface.cpp b/source/surface.cpp index 6a67dae..3c11fab 100644 --- a/source/surface.cpp +++ b/source/surface.cpp @@ -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) { diff --git a/source/surface.h b/source/surface.h index 143e982..a9d9d41 100644 --- a/source/surface.h +++ b/source/surface.h @@ -1,15 +1,16 @@ #pragma once -#include // for SDL_Rect, SDL_FRect -#include // for SDL_Renderer, SDL_Texture -#include // for Uint8, Uint16, Uint32 -#include // for SDL_FlipMode -#include // for array -#include // for default_delete, shared_ptr, __shared_p... -#include // for iota -#include // for invalid_argument -#include // for string -#include // for move +#include // for SDL_Rect, SDL_FRect +#include // for SDL_Renderer, SDL_Texture +#include // for Uint8, Uint16, Uint32 +#include // for SDL_FlipMode +#include // for array +#include // for default_delete, shared_ptr, __shared_p... +#include // for iota +#include // for invalid_argument +#include // for string +#include // for move +#include // Alias using Palette = std::array; @@ -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 &palette) { palette_ = palette; }