diff --git a/source/core/defaults.hpp b/source/core/defaults.hpp index e5cda6a..3b6f2fc 100644 --- a/source/core/defaults.hpp +++ b/source/core/defaults.hpp @@ -479,6 +479,9 @@ constexpr float FLOAT_PHASE_OFFSET = 1.57f; // π/2 (90°) constexpr float P1_ENTRY_DELAY = 0.0f; // P1 entra immediatament constexpr float P2_ENTRY_DELAY = 0.5f; // P2 entra 0.5s després +// Delay global abans d'iniciar l'animació d'entrada al estat MAIN +constexpr float ENTRANCE_DELAY = 5.0f; // Temps d'espera abans que les naus entrin + // Multiplicadors de freqüència per a cada nau (variació sutil ±12%) constexpr float P1_FREQUENCY_MULTIPLIER = 0.88f; // 12% més lenta constexpr float P2_FREQUENCY_MULTIPLIER = 1.12f; // 12% més ràpida diff --git a/source/game/escenes/escena_titol.cpp b/source/game/escenes/escena_titol.cpp index dc7cb55..4ff991f 100644 --- a/source/game/escenes/escena_titol.cpp +++ b/source/game/escenes/escena_titol.cpp @@ -362,15 +362,21 @@ void EscenaTitol::actualitzar(float delta_time) { animacio_activa_ = false; // Comença estàtic factor_lerp_ = 0.0f; // Sense animació encara - // Iniciar animació d'entrada de naus - ship_animator_->set_visible(true); - ship_animator_->start_entry_animation(); + // Naus esperaran ENTRANCE_DELAY abans d'entrar (no iniciar aquí) } break; case EstatTitol::MAIN: { temps_estat_main_ += delta_time; + // Iniciar animació d'entrada de naus després del delay + if (temps_estat_main_ >= Defaults::Title::Ships::ENTRANCE_DELAY) { + if (ship_animator_ && !ship_animator_->is_visible()) { + ship_animator_->set_visible(true); + ship_animator_->start_entry_animation(); + } + } + // Fase 1: Estàtic (0-10s) if (temps_estat_main_ < DELAY_INICI_ANIMACIO) { factor_lerp_ = 0.0f; @@ -458,9 +464,7 @@ void EscenaTitol::actualitzar(float delta_time) { starfield_->set_brightness(BRIGHTNESS_STARFIELD); temps_estat_main_ = 0.0f; - // Iniciar animació d'entrada de naus - ship_animator_->set_visible(true); - ship_animator_->start_entry_animation(); + // Naus esperaran ENTRANCE_DELAY abans d'entrar (no iniciar aquí) } } @@ -471,6 +475,12 @@ void EscenaTitol::actualitzar(float delta_time) { bool p2_actiu_abans = config_partida_.jugador2_actiu; if (checkStartGameButtonPressed()) { + // Si START es prem durant el delay (naus encara invisibles), saltar-les a FLOATING + if (ship_animator_ && !ship_animator_->is_visible()) { + ship_animator_->set_visible(true); + ship_animator_->skip_to_floating_state(); + } + // Configurar partida abans de canviar d'escena context_.set_config_partida(config_partida_); std::cout << "[EscenaTitol] Configuració de partida - P1: " diff --git a/source/game/title/ship_animator.cpp b/source/game/title/ship_animator.cpp index 075d17a..3adeb37 100644 --- a/source/game/title/ship_animator.cpp +++ b/source/game/title/ship_animator.cpp @@ -101,6 +101,32 @@ void ShipAnimator::trigger_exit_animation() { } } +void ShipAnimator::skip_to_floating_state() { + // Posar ambdues naus directament en estat FLOATING + for (auto& nau : naus_) { + nau.estat = EstatNau::FLOATING; + nau.temps_estat = 0.0f; + nau.fase_oscilacio = 0.0f; + + // Posar en posició objectiu (sense animació) + nau.posicio_actual = nau.posicio_objectiu; + nau.escala_actual = nau.escala_objectiu; + + // NO establir visibilitat aquí - ja ho fa el caller + // (evita fer visibles ambdues naus quan només una ha premut START) + } +} + +bool ShipAnimator::is_visible() const { + // Retorna true si almenys una nau és visible + for (const auto& nau : naus_) { + if (nau.visible) { + return true; + } + } + return false; +} + void ShipAnimator::trigger_exit_animation_for_player(int jugador_id) { // Trobar la nau del jugador especificat for (auto& nau : naus_) { diff --git a/source/game/title/ship_animator.hpp b/source/game/title/ship_animator.hpp index b3fa5b7..9369e0b 100644 --- a/source/game/title/ship_animator.hpp +++ b/source/game/title/ship_animator.hpp @@ -73,10 +73,12 @@ class ShipAnimator { void start_entry_animation(); void trigger_exit_animation(); // Anima totes les naus void trigger_exit_animation_for_player(int jugador_id); // Anima només una nau (P1=1, P2=2) + void skip_to_floating_state(); // Salta directament a FLOATING sense animació // Control de visibilitat void set_visible(bool visible); bool is_animation_complete() const; + bool is_visible() const; // Comprova si alguna nau és visible private: SDL_Renderer* renderer_;