#pragma once #include #include // Para shared_ptr #include // Para string #include // Para vector #include "utils/delta_timer.hpp" // Para DeltaTimer class SurfaceSprite; // Forward declaration class Surface; // Forward declaration class Title { private: struct TitleLetter { std::string letter; // Letra a escribir float x; // Posición en el eje x (float para precisión con delta time) bool enabled; // Solo se escriben y mueven si estan habilitadas }; enum class TitleState { SHOW_LOADING_SCREEN, FADE_LOADING_SCREEN, SHOW_MENU }; // --- Constantes de tiempo (en segundos) --- static constexpr float SHOW_LOADING_DURATION = 5.0f; // Tiempo mostrando loading screen (antes 500 frames) static constexpr float FADE_STEP_INTERVAL = 0.033f; // Intervalo entre pasos de fade (antes cada 4 frames) static constexpr float AUTO_CREDITS_TIMEOUT = 22.0f; // Timeout para ir a créditos (antes 2200 frames) static constexpr float MARQUEE_SPEED = 100.0f; // Velocidad de marquesina (pixels/segundo) static constexpr float CHEEVOS_SCROLL_SPEED = 120.0f; // Velocidad de scroll de logros (pixels/segundo) // Objetos y punteros std::shared_ptr title_logo_surface_; // Textura con los graficos std::shared_ptr title_logo_sprite_; // SSprite para manejar la surface std::shared_ptr loading_screen_surface_; // Surface con los gráficos de la pantalla de carga std::shared_ptr loading_screen_sprite_; // SSprite con los gráficos de la pantalla de carga std::shared_ptr bg_surface_; // Textura para dibujar el fondo de la pantalla std::shared_ptr cheevos_surface_; // Textura con la lista de logros std::shared_ptr cheevos_sprite_; // SSprite para manejar la surface con la lista de logros // --- Variables de estado --- std::unique_ptr delta_timer_; // Timer para delta time std::string long_text_; // Texto que aparece en la parte inferior del titulo std::vector letters_; // Vector con las letras de la marquesina bool show_cheevos_ = false; // Indica si se muestra por pantalla el listado de logros SDL_FRect cheevos_surface_view_; // Zona visible de la surface con el listado de logros TitleState state_; // Estado en el que se encuentra el bucle principal float state_time_; // Tiempo acumulado en el estado actual float fade_accumulator_; // Acumulador para controlar el fade por tiempo float current_delta_; // Delta time del frame actual // --- Funciones --- void update(); // Actualiza las variables void render(); // Dibuja en pantalla void checkEvents(); // Comprueba el manejador de eventos void checkInput(); // Comprueba las entradas void updateState(float delta_time); // Actualiza el estado actual void transitionToState(TitleState new_state); // Transiciona a un nuevo estado void initMarquee(); // Inicializa la marquesina void updateMarquee(float delta_time); // Actualiza la marquesina (time-based) void renderMarquee(); // Dibuja la marquesina void moveCheevosList(int direction, float delta_time); // Desplaza la lista de logros (time-based) // Rellena la surface de fondo con todos los gráficos void fillSurface(); // Crea y rellena la surface para mostrar los logros void createCheevosTexture(); // Oculta la lista de logros void hideCheevosList(); public: // Constructor Title(); // Destructor ~Title() = default; // Bucle principal void run(); };