#pragma once #include // Para Uint32 #include // Para unique_ptr, shared_ptr #include #include #include "section.hpp" // Para Options class DefineButtons; class Fade; class GameLogo; class Player; class Sprite; class Text; class TiledBG; // Textos constexpr std::string_view TEXT_COPYRIGHT = "@2020,2025 JailDesigner"; // Parámetros constexpr bool ALLOW_TITLE_ANIMATION_SKIP = false; /* Clase que gestiona el estado de título/menú principal del juego. Responsable de mostrar el logo, el fondo animado y gestionar la entrada para comenzar la partida. No permite saltar la animación del título salvo que se cambie el define. */ // Clase Title class Title { public: // --- Constructores y destructor --- Title(); ~Title(); // --- Método principal --- void run(); // Bucle para el título del juego private: // --- Enumeraciones --- enum class TitleState { LOGO_ANIMATING, // El logo está animándose LOGO_FINISHED, // El logo ha terminado de animarse START_HAS_BEEN_PRESSED, // Se ha pulsado el botón de start }; // --- Estructura para definir anclas --- struct Anchor { int mini_logo; int copyright_text; }; // --- Objetos y punteros --- std::shared_ptr text_; // Objeto de texto para escribir en pantalla std::unique_ptr fade_; // Fundido en pantalla std::unique_ptr tiled_bg_; // Fondo animado de tiles std::unique_ptr game_logo_; // Logo del juego std::unique_ptr mini_logo_sprite_; // Logo JailGames mini std::unique_ptr define_buttons_; // Definición de botones del joystick std::vector> players_; // Vector de jugadores // --- Variables de estado --- int counter_ = 0; // Temporizador para la pantalla de título Uint64 ticks_ = 0; // Contador de ticks para ajustar la velocidad Section::Name next_section_; // Siguiente sección a cargar Section::Options selection_ = Section::Options::TITLE_TIME_OUT; // Opción elegida en el título int num_controllers_; // Número de mandos conectados TitleState state_; // Estado actual de la sección bool should_render_start_prompt_ = false; // Indica si se muestra o no el texto de PRESS START BUTTON TO PLAY bool player1_start_pressed_ = false; // Indica si se ha pulsdo el boton de empezar a jugar para el jugador 1 bool player2_start_pressed_ = false; // Indica si se ha pulsdo el boton de empezar a jugar para el jugador 2 // -- Variables de diseño --- Anchor anchor_; // Anclas para definir la posición de los elementos del titulo // --- Métodos internos --- void update(); // Actualiza las variables del objeto void render(); // Dibuja el objeto en pantalla void checkEvents(); // Comprueba los eventos void checkInput(); // Comprueba las entradas void resetCounter(); // Reinicia el contador interno static void swapControllers(); // Intercambia la asignación de mandos a los jugadores static void swapKeyboard(); // Intercambia el teclado de jugador static void showControllers(); // Muestra información sobre los controles y los jugadores void updateFade(); // Actualiza el efecto de fundido (fade in/out) void updateState(); // Actualiza el estado actual del título void updateStartPrompt(); // Actualiza el mensaje de "Pulsa Start" void renderStartPrompt(); // Dibuja el mensaje de "Pulsa Start" en pantalla void renderCopyright(); // Dibuja el aviso de copyright void setState(TitleState state); // Cambia el estado del título void initPlayers(); // Inicializa los jugadores void renderPlayers(); // Renderiza los jugadores void updatePlayers(); // Actualza los jugadores auto getPlayer(int id) -> std::shared_ptr; // Obtiene un jugador a partir de su "id" };