#pragma once #include // Para SDL_FPoint, Uint64 #include // Para shared_ptr, unique_ptr #include // Para vector #include "color.hpp" // for Color class Sprite; class Texture; // --- Clase Logo: pantalla de presentación de JAILGAMES con efectos retro --- // // Esta clase gestiona el estado inicial del programa, mostrando el logo corporativo // de JAILGAMES con efectos visuales inspirados en el ZX Spectrum. // // Funcionalidades principales: // • Animación de convergencia: cada línea del logo entra desde los laterales // • Efectos de color: transiciones automáticas usando la paleta ZX Spectrum // • Audio sincronizado: reproduce sonido del logo en momento específico // • Transición temporal: duración controlada con paso automático al siguiente estado // • Sistema delta-time: animaciones suaves independientes del framerate // // La clase utiliza un sistema de tiempo basado en segundos para garantizar // consistencia visual en diferentes velocidades de procesamiento. class Logo { public: // --- Constructor y destructor --- Logo(); ~Logo(); // --- Bucle principal --- void run(); private: // --- Constantes de tiempo (en segundos) --- static constexpr float SOUND_TRIGGER_TIME_S = 0.5F; // Tiempo para activar el sonido del logo static constexpr float SHOW_SINCE_SPRITE_TIME_S = 1.167F; // Tiempo para mostrar el sprite "SINCE 1998" static constexpr float INIT_FADE_TIME_S = 5.0F; // Tiempo de inicio del fade a negro static constexpr float END_LOGO_TIME_S = 6.668F; // Tiempo de finalización del logo static constexpr float POST_LOGO_DURATION_S = 0.333F; // Duración adicional después del fade static constexpr float LOGO_SPEED_PX_PER_S = 480.0F; // Velocidad de desplazamiento (píxeles por segundo) - 8.0f/16.67f*1000 static constexpr float COLOR_CHANGE_INTERVAL_S = 0.0667F; // Intervalo entre cambios de color (~4 frames a 60fps) // --- Constantes de layout --- static constexpr int SINCE_SPRITE_Y_OFFSET = 83; // Posición Y base del sprite "Since 1998" static constexpr int LOGO_SPACING = 5; // Espaciado entre elementos del logo static constexpr int LINE_OFFSET_FACTOR = 3; // Factor de desplazamiento inicial por línea static constexpr int SPRITE_LINE_HEIGHT = 1; // Altura de cada línea sprite // --- Constantes de colores --- static constexpr int MAX_SINCE_COLOR_INDEX = 7; // Índice máximo para colores del sprite "Since" static constexpr int MAX_FADE_COLOR_INDEX = 6; // Índice máximo para colores del fade // --- Paleta ZX Spectrum para efectos de logo --- static constexpr Color SPECTRUM_BLACK = Color(0x00, 0x00, 0x00); // Negro static constexpr Color SPECTRUM_BLUE = Color(0x00, 0x00, 0xd8); // Azul static constexpr Color SPECTRUM_RED = Color(0xd8, 0x00, 0x00); // Rojo static constexpr Color SPECTRUM_MAGENTA = Color(0xd8, 0x00, 0xd8); // Magenta static constexpr Color SPECTRUM_GREEN = Color(0x00, 0xd8, 0x00); // Verde static constexpr Color SPECTRUM_CYAN = Color(0x00, 0xd8, 0xd8); // Cian static constexpr Color SPECTRUM_YELLOW = Color(0xd8, 0xd8, 0x00); // Amarillo static constexpr Color SPECTRUM_WHITE = Color(0xFF, 0xFF, 0xFF); // Blanco brillante static constexpr Color RESET_COLOR = Color(255, 255, 255); // Color de reset // --- Objetos y punteros --- std::shared_ptr since_texture_; // Textura con los gráficos "Since 1998" std::unique_ptr since_sprite_; // Sprite para manejar la since_texture std::shared_ptr jail_texture_; // Textura con los gráficos "JAILGAMES" std::vector> jail_sprite_; // Vector con los sprites de cada línea que forman el bitmap JAILGAMES // --- Variables --- std::vector color_; // Vector con los colores para el fade float elapsed_time_s_ = 0.0F; // Tiempo transcurrido en segundos Uint64 last_time_ = 0; // Último timestamp para calcular delta-time SDL_FPoint dest_; // Posición donde dibujar el logo bool sound_triggered_ = false; // Indica si el sonido del logo ya se reprodujo // --- Métodos internos --- void update(float delta_time); // Actualiza las variables void render(); // Dibuja en pantalla static void checkEvents(); // Comprueba el manejador de eventos static void checkInput(); // Comprueba las entradas void updateJAILGAMES(float delta_time); // Gestiona el logo de JAILGAMES void renderJAILGAMES(); // Renderiza el logo de JAILGAMES void updateTextureColors(float delta_time); // Gestiona el color de las texturas void handleSound(); // Maneja la reproducción del sonido del logo auto calculateDeltaTime() -> float; // Calcula el tiempo transcurrido desde el último frame };