102 lines
5.5 KiB
C++
102 lines
5.5 KiB
C++
// 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 <SDL3/SDL.h>
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#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/system/context_escenes.hpp"
|
|
#include "core/types.hpp"
|
|
|
|
class EscenaTitol {
|
|
public:
|
|
explicit EscenaTitol(SDLManager& sdl, GestorEscenes::ContextEscenes& context);
|
|
~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 {
|
|
STARFIELD_FADE_IN, // Fade-in del starfield (1.5s)
|
|
STARFIELD, // Pantalla con el campo de estrellas
|
|
MAIN, // Pantalla de títol amb text
|
|
TRANSITION_TO_GAME // 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<Graphics::Shape> 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_;
|
|
GestorEscenes::ContextEscenes& context_;
|
|
Graphics::VectorText text_; // Sistema de text vectorial
|
|
std::unique_ptr<Graphics::Starfield> 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<LetraLogo> lletres_orni_; // Lletres de "ORNI" (línia 1)
|
|
std::vector<LetraLogo> lletres_attack_; // Lletres de "ATTACK!" (línia 2)
|
|
float y_attack_dinamica_; // Posició Y calculada dinàmicament per "ATTACK!"
|
|
|
|
// Estat d'animació del logo
|
|
float temps_animacio_; // Temps acumulat per animació orbital
|
|
std::vector<Punt> posicions_originals_orni_; // Posicions originals de "ORNI"
|
|
std::vector<Punt> posicions_originals_attack_; // Posicions originals de "ATTACK!"
|
|
|
|
// Estat d'arrencada de l'animació
|
|
float temps_estat_main_; // Temps acumulat en estat MAIN
|
|
bool animacio_activa_; // Flag: true quan animació està activa
|
|
float factor_lerp_; // Factor de lerp actual (0.0 → 1.0)
|
|
|
|
// Constants
|
|
static constexpr float BRIGHTNESS_STARFIELD = 1.2f; // Brightness del starfield (>1.0 = més brillant)
|
|
static constexpr float DURACIO_FADE_IN = 3.0f; // Duració del fade-in del starfield (1.5 segons)
|
|
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
|
|
|
|
// Constants d'animació del logo
|
|
static constexpr float ORBIT_AMPLITUDE_X = 4.0f; // Amplitud oscil·lació horitzontal (píxels)
|
|
static constexpr float ORBIT_AMPLITUDE_Y = 3.0f; // Amplitud oscil·lació vertical (píxels)
|
|
static constexpr float ORBIT_FREQUENCY_X = 0.8f; // Velocitat oscil·lació horitzontal (Hz)
|
|
static constexpr float ORBIT_FREQUENCY_Y = 1.2f; // Velocitat oscil·lació vertical (Hz)
|
|
static constexpr float ORBIT_PHASE_OFFSET = 1.57f; // Desfasament entre X i Y (90° per circular)
|
|
|
|
// Constants d'ombra del logo
|
|
static constexpr float SHADOW_DELAY = 0.5f; // Retard temporal de l'ombra (segons)
|
|
static constexpr float SHADOW_BRIGHTNESS = 0.4f; // Multiplicador de brillantor de l'ombra (0.0-1.0)
|
|
static constexpr float SHADOW_OFFSET_X = 2.0f; // Offset espacial X fix (píxels)
|
|
static constexpr float SHADOW_OFFSET_Y = 2.0f; // Offset espacial Y fix (píxels)
|
|
|
|
// Temporització de l'arrencada de l'animació
|
|
static constexpr float DELAY_INICI_ANIMACIO = 10.0f; // 10s estàtic abans d'animar
|
|
static constexpr float DURACIO_LERP = 2.0f; // 2s per arribar a amplitud completa
|
|
|
|
// Mètodes privats
|
|
void actualitzar(float delta_time);
|
|
void actualitzar_animacio_logo(float delta_time); // Actualitza l'animació orbital del logo
|
|
void dibuixar();
|
|
void processar_events(const SDL_Event& event);
|
|
void inicialitzar_titol(); // Carrega i posiciona les lletres del títol
|
|
};
|