#pragma once #include #include // for vector #include "game/options.hpp" // for Options::Video, Options::Window (per snapshot cancel) #include "game/scenes/instructions.h" // for mode_e #include "utils/utils.h" // for input_t, section_t class AnimatedSprite; class Fade; class Game; class Menu; class SmartSprite; class Sprite; class Text; class Texture; struct JA_Music_t; struct JA_Sound_t; // Textos constexpr const char *TEXT_COPYRIGHT = "@2020 JailDesigner (v2.3.4)"; // Contadores constexpr int TITLE_COUNTER = 800; // Cantidad de eventos de la pantalla de título constexpr int TITLE_TOTAL_EVENTS = 2; class Title { private: struct menu_t { Menu *title; // Menu de la pantalla de título Menu *options; // Menú de la pantalla de opciones Menu *playerSelect; // Menu para elegir jugador Menu *active; // Menu activo (de momento para la pantalla del titulo) bool keyPressed; // Variable para evitar la repetición de teclas en los menus }; // Objetos y punteros SDL_Renderer *renderer; // El renderizador de la ventana Instructions *instructions{nullptr}; // Objeto para la sección de las instrucciones Game *demoGame{nullptr}; // Objeto para lanzar la demo del juego SDL_Event *eventHandler; // Manejador de eventos section_t *section; // Indicador para el bucle del titulo Texture *dustTexture; // Textura con los graficos del polvo Texture *coffeeTexture; // Textura con los graficos de la palabra coffee Texture *crisisTexture; // Textura con los graficos de la plabra crisis Texture *gradientTexture; // Textura con los graficos para el degradado del fondo del titulo SDL_Rect backgroundWindow; // Ventana visible para la textura de fondo del titulo SDL_Texture *background; // Textura dibujar el fondo del titulo AnimatedSprite *dustBitmapL; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo AnimatedSprite *dustBitmapR; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo SmartSprite *coffeeBitmap; // Sprite con la palabra COFFEE para la pantalla de titulo SmartSprite *crisisBitmap; // Sprite con la palabra CRISIS para la pantalla de titulo Sprite *gradient; // Sprite para dibujar el degradado del titulo Text *text1; // Objeto de texto para poder escribir textos en pantalla Text *text2; // Objeto de texto para poder escribir textos en pantalla Fade *fade; // Objeto para realizar fundidos en pantalla // Variable JA_Music_t *titleMusic; // Musica para el titulo JA_Sound_t *crashSound; // Sonido con el impacto del título int backgroundCounter; // Temporizador para el fondo de tiles de la pantalla de titulo int counter; // Temporizador para la pantalla de titulo Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint8 backgroundMode; // Variable para almacenar el tipo de efecto que hará el fondo de la pantalla de titulo float sin[360]; // Vector con los valores del seno precalculados bool menuVisible; // Indicador para saber si se muestra el menu del titulo o la frase intermitente bool demo; // Indica si el modo demo estará activo section_t nextSection; // Indica cual es la siguiente sección a cargar cuando termine el contador del titulo Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint8 postFade; // Opción a realizar cuando termina el fundido menu_t menu; // Variable con todos los objetos menus y sus variables // Snapshot per a permetre CANCEL al menú d'opcions. Options::Video prevVideo; Options::Window prevWindow; Options::Settings prevSettings; std::vector prevInputs; std::vector availableInputDevices; // Vector con todos los metodos de control disponibles std::vector deviceIndex; // Indice para el jugador [i] del vector de dispositivos de entrada disponibles // Variables para la vibración del título (SUBSECTION_TITLE_2) int vibrationStep; // Paso actual de la vibración int vibrationCoffeeBaseX{0}; // Posición X base del bitmap Coffee int vibrationCrisisBaseX{0}; // Posición X base del bitmap Crisis bool vibrationInitialized; // Indica si se han capturado las posiciones base // Variables para sub-estados delegados (instrucciones y demo) bool instructionsActive; // Indica si las instrucciones están activas bool demoGameActive; // Indica si el juego demo está activo mode_e instructionsMode{m_auto}; // Modo de las instrucciones activas bool demoThenInstructions; // Indica si tras la demo hay que mostrar instrucciones // Inicializa los valores void init(); // Actualiza las variables del objeto void update(); // Dibuja el objeto en pantalla void render(); // Comprueba las entradas void checkInput(); // Actualiza el tileado de fondo void updateBG(); // Cambia el valor de la variable de modo de pantalla completa void switchFullScreenModeVar(); // Actualiza los elementos de los menus void updateMenuLabels(); // Aplica las opciones de menu seleccionadas void applyOptions(); // Ejecuta la parte donde se muestran las instrucciones void runInstructions(mode_e mode); // Ejecuta el juego en modo demo void runDemoGame(); // Modifica las opciones para los controles de los jugadores bool updatePlayerInputs(int numPlayer); // Crea el mosaico de fondo del titulo void createTiledBackground(); // Comprueba cuantos mandos hay conectados para gestionar el menu de opciones void checkInputDevices(); // Recarga las texturas void reLoadTextures(); public: // Constructor Title(SDL_Renderer *renderer, section_t *section); // Destructor ~Title(); Title(const Title &) = delete; Title &operator=(const Title &) = delete; // Bucle para el titulo del juego void run(); // Ejecuta un frame void iterate(); // Procesa un evento void handleEvent(const SDL_Event *event); };