#pragma once #include // Para SDL_Point #include // Para Uint32 #include #include // Para shared_ptr, unique_ptr #include // Para vector class Sprite; class Texture; // lines 9-9 struct Color; /* Esta clase gestiona un estado del programa. Se encarga de dibujar por pantalla el logo de "JAILGAMES" utilizando un sencillo efecto consistente en generar un sprite por cada linea del bitmap que forma la palabra "JAILGAMES". Posteriormente realiza una modulación de color sobre la textura para simular un fade to black al estilo ZX Spectrum */ struct Pixel { int x, y; // Coordenadas del píxel Uint8 r, g, b, a; // Color del píxel // Método para ascender y desvanecerse void evaporate() { y -= 1; // Asciende hacia arriba a = (a > 5) ? a - 5 : 0; // Desvanece el alfa (transparencia) // Añadir movimiento zig-zag aleatorio x += (rand() % 3 - 1); // Movimiento horizontal aleatorio (-1, 0, 1) } }; // Clase Logo class Logo { private: enum class LogoState { JAILGAMES, RETROWEEKEND, }; // Constantes static constexpr int SHOW_SINCE_SPRITE_COUNTER_MARK = 70; // Tiempo del contador en el que empieza a verse el sprite de "SINCE 1998" static constexpr int INIT_FADE_COUNTER_MARK = 300; // Tiempo del contador cuando inicia el fade a negro static constexpr int END_LOGO_COUNTER_MARK = 400; // Tiempo del contador para terminar el logo static constexpr int POST_LOGO_DURATION = 20; // Tiempo que dura el logo con el fade al maximo static constexpr int SPEED = 8; // Velocidad de desplazamiento de cada linea // Objetos y punteros std::shared_ptr since_texture_; // Textura con los graficos "Since 1998" std::unique_ptr since_sprite_; // Sprite para manejar la sinceTexture std::shared_ptr jail_texture_; // Textura con los graficos "JAILGAMES" std::vector> jail_sprite_; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES // Variables std::vector color_; // Vector con los colores para el fade int counter_; // Contador Uint32 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa SDL_Point dest_; // Posición X donde dibujar el logo LogoState state_ = LogoState::JAILGAMES; // El estado indica qué logo se está procesando Uint32 ticks_start_ = 0; // Almacena el valor actual de los ticks de SDL std::vector pixels_; // Vector con los pixels que forman el logo de "RETROWEEKEND" // Actualiza las variables void update(); // Dibuja en pantalla void render(); // Comprueba el manejador de eventos void checkEvents(); // Comprueba las entradas void checkInput(); // Gestiona el logo de JAILGAMES void updateJAILGAMES(); // Gestiona el logo de RETROWEEKEND void updateRETROWEEKEND(); // Renderiza el logo de JAILGAMES void renderJAILGAMES(); // Renderiza el logo de RETROWEEKEND void renderRETROWEEKEND(); // Gestiona el color de las texturas void updateTextureColors(); // Recarga todas las texturas void reloadTextures(); std::vector extractPixels(SDL_Texture *texture); void renderAndEvaporate(SDL_Renderer *renderer, std::vector &pixels); public: // Constructor Logo(); // Destructor ~Logo(); // Bucle principal void run(); };