// escena_titol.hpp - Pantalla de títol del joc // Mostra missatge "PRESS BUTTON TO PLAY" i copyright // © 2025 Port a C++20 #pragma once #include #include #include #include "core/defaults.hpp" #include "core/graphics/shape.hpp" #include "core/graphics/starfield.hpp" #include "core/graphics/vector_text.hpp" #include "core/rendering/sdl_manager.hpp" #include "core/types.hpp" class EscenaTitol { public: explicit EscenaTitol(SDLManager& sdl); ~EscenaTitol(); // Destructor per aturar música void executar(); // Bucle principal de l'escena private: // Màquina d'estats per la pantalla de títol enum class EstatTitol { INIT, // Pantalla negra inicial (2 segons) MAIN, // Pantalla de títol amb text TRANSITION // Transició amb fade-out de música i text parpellejant }; // Estructura per emmagatzemar informació de cada lletra del títol struct LetraLogo { std::shared_ptr forma; // Forma vectorial de la lletra Punt posicio; // Posició en pantalla float ancho; // Amplada escalada float altura; // Altura escalada float offset_centre; // Offset del centre per posicionament }; SDLManager& sdl_; Graphics::VectorText text_; // Sistema de text vectorial std::unique_ptr starfield_; // Camp d'estrelles de fons EstatTitol estat_actual_; // Estat actual de la màquina float temps_acumulat_; // Temps acumulat per l'estat INIT // Lletres del títol "ORNI ATTACK!" std::vector lletres_orni_; // Lletres de "ORNI" (línia 1) std::vector lletres_attack_; // Lletres de "ATTACK!" (línia 2) float y_attack_dinamica_; // Posició Y calculada dinàmicament per "ATTACK!" // Constants static constexpr float DURACIO_INIT = 4.0f; // Duració de l'estat INIT (2 segons) static constexpr float DURACIO_TRANSITION = 1.5f; // Duració de la transició (1.5 segons) static constexpr float ESCALA_TITULO = 0.6f; // Escala per les lletres del títol (50%) static constexpr float ESPAI_ENTRE_LLETRES = 10.0f; // Espai entre lletres static constexpr float Y_ORNI = 150.0f; // Posició Y de "ORNI" static constexpr float SEPARACION_LINEAS = 10.0f; // Separació entre "ORNI" i "ATTACK!" (0.0f = pegades) static constexpr float BLINK_FREQUENCY = 3.0f; // Freqüència de parpelleig (3 Hz) static constexpr int MUSIC_FADE = 1000; // Duracio del fade de la musica del titol al començar a jugar // Mètodes privats void actualitzar(float delta_time); void dibuixar(); void processar_events(const SDL_Event& event); void inicialitzar_titol(); // Carrega i posiciona les lletres del títol };