diff --git a/source/game/escenes/escena_titol.cpp b/source/game/escenes/escena_titol.cpp index 26e175e..162be04 100644 --- a/source/game/escenes/escena_titol.cpp +++ b/source/game/escenes/escena_titol.cpp @@ -365,7 +365,7 @@ void EscenaTitol::actualitzar(float delta_time) { break; } - case EstatTitol::TRANSITION_TO_GAME: + case EstatTitol::PLAYER_JOIN_PHASE: temps_acumulat_ += delta_time; // Continuar animació orbital durant la transició @@ -375,11 +375,32 @@ void EscenaTitol::actualitzar(float delta_time) { if (checkStartGameButtonPressed()) { // Updates config_partida_ if pressed, logs are in the method context_.set_config_partida(config_partida_); + + // Reproducir so de LASER quan el segon jugador s'uneix + Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME); + + // Reiniciar el timer per allargar el temps de transició + temps_acumulat_ = 0.0f; + + std::cout << "[EscenaTitol] Segon jugador s'ha unit - so i timer reiniciats\n"; } if (temps_acumulat_ >= DURACIO_TRANSITION) { - // Transició a JOC (la música ja s'ha parat en el fade) + // Transició a pantalla negra + estat_actual_ = EstatTitol::BLACK_SCREEN; + temps_acumulat_ = 0.0f; + std::cout << "[EscenaTitol] Passant a BLACK_SCREEN\n"; + } + break; + + case EstatTitol::BLACK_SCREEN: + temps_acumulat_ += delta_time; + + // No animation, no input checking - just wait + if (temps_acumulat_ >= DURACIO_BLACK_SCREEN) { + // Transició a escena JOC GestorEscenes::actual = Escena::JOC; + std::cout << "[EscenaTitol] Canviant a escena JOC\n"; } break; } @@ -406,7 +427,7 @@ void EscenaTitol::actualitzar(float delta_time) { << std::endl; context_.canviar_escena(Escena::JOC); - estat_actual_ = EstatTitol::TRANSITION_TO_GAME; + estat_actual_ = EstatTitol::PLAYER_JOIN_PHASE; temps_acumulat_ = 0.0f; Audio::get()->fadeOutMusic(MUSIC_FADE); Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME); @@ -445,8 +466,8 @@ void EscenaTitol::actualitzar_animacio_logo(float delta_time) { } void EscenaTitol::dibuixar() { - // Dibuixar starfield de fons (sempre, en tots els estats) - if (starfield_) { + // Dibuixar starfield de fons (en tots els estats excepte BLACK_SCREEN) + if (starfield_ && estat_actual_ != EstatTitol::BLACK_SCREEN) { starfield_->dibuixar(); } @@ -455,8 +476,9 @@ void EscenaTitol::dibuixar() { return; } - // Estat MAIN i TRANSITION_TO_GAME: Dibuixar títol i text (sobre el starfield) - if (estat_actual_ == EstatTitol::MAIN || estat_actual_ == EstatTitol::TRANSITION_TO_GAME) { + // Estat MAIN i PLAYER_JOIN_PHASE: Dibuixar títol i text (sobre el starfield) + // BLACK_SCREEN: no dibuixar res (fons negre ja està netejat) + if (estat_actual_ == EstatTitol::MAIN || estat_actual_ == EstatTitol::PLAYER_JOIN_PHASE) { // === Calcular i renderitzar ombra (només si animació activa) === if (animacio_activa_) { float temps_shadow = temps_animacio_ - SHADOW_DELAY; @@ -545,7 +567,7 @@ void EscenaTitol::dibuixar() { const float spacing = 2.0f; // Espai entre caràcters (usat també per copyright) bool mostrar_text = true; - if (estat_actual_ == EstatTitol::TRANSITION_TO_GAME) { + if (estat_actual_ == EstatTitol::PLAYER_JOIN_PHASE) { // Parpelleig: sin oscil·la entre -1 i 1, volem ON quan > 0 float fase = temps_acumulat_ * BLINK_FREQUENCY * 2.0f * 3.14159f; // 2π × freq × temps mostrar_text = (std::sin(fase) > 0.0f); diff --git a/source/game/escenes/escena_titol.hpp b/source/game/escenes/escena_titol.hpp index 0dbcf23..fa3fbab 100644 --- a/source/game/escenes/escena_titol.hpp +++ b/source/game/escenes/escena_titol.hpp @@ -34,10 +34,11 @@ class EscenaTitol { 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 + STARFIELD_FADE_IN, // Fade-in del starfield (3.0s) + STARFIELD, // Pantalla amb camp d'estrelles (4.0s) + MAIN, // Pantalla de títol amb text (indefinit, fins START) + PLAYER_JOIN_PHASE, // Fase d'unió de jugadors: fade-out música + text parpellejant (2.5s) + BLACK_SCREEN // Pantalla negra de transició (2.0s) }; // Estructura per emmagatzemar informació de cada lletra del títol @@ -76,13 +77,14 @@ class EscenaTitol { 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 DURACIO_TRANSITION = 2.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 + static constexpr float DURACIO_BLACK_SCREEN = 2.0f; // Duració pantalla negra (2 segons) + static constexpr int MUSIC_FADE = 1500; // 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)