diff --git a/Makefile b/Makefile index 32bcd81..6355d8c 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,8 @@ APP_SOURCES := \ source/main.cpp \ source/core/system/director.cpp \ source/core/system/global_events.cpp \ + source/core/audio/audio.cpp \ + source/core/audio/audio_cache.cpp \ source/core/rendering/sdl_manager.cpp \ source/core/rendering/line_renderer.cpp \ source/core/rendering/color_oscillator.cpp \ diff --git a/data/sounds/logo.wav b/data/sounds/logo.wav new file mode 100644 index 0000000..8e5d880 Binary files /dev/null and b/data/sounds/logo.wav differ diff --git a/source/game/escenes/escena_logo.cpp b/source/game/escenes/escena_logo.cpp index 4d6a8f7..1bae040 100644 --- a/source/game/escenes/escena_logo.cpp +++ b/source/game/escenes/escena_logo.cpp @@ -7,6 +7,7 @@ #include #include +#include "../../core/audio/audio.hpp" #include "../../core/graphics/shape_loader.hpp" #include "../../core/rendering/shape_renderer.hpp" #include "../../core/system/gestor_escenes.hpp" @@ -42,6 +43,7 @@ EscenaLogo::EscenaLogo(SDLManager& sdl) lletra_explosio_index_(0), temps_des_ultima_explosio_(0.0f) { std::cout << "Escena Logo: Inicialitzant...\n"; + so_reproduit_.fill(false); // Inicialitzar seguiment de sons inicialitzar_lletres(); } @@ -229,11 +231,31 @@ void EscenaLogo::actualitzar(float delta_time) { } break; - case EstatAnimacio::ANIMATION: + case EstatAnimacio::ANIMATION: { + // Reproduir so per cada lletra quan comença a aparèixer + float global_progress = std::min(temps_estat_actual_ / DURACIO_ZOOM, 1.0f); + + for (size_t i = 0; i < lletres_.size() && i < so_reproduit_.size(); i++) { + if (!so_reproduit_[i]) { + float letra_progress = calcular_progress_letra( + i, + lletres_.size(), + global_progress, + THRESHOLD_LETRA); + + // Reproduir so quan la lletra comença a aparèixer (progress > 0) + if (letra_progress > 0.0f) { + Audio::get()->playSound("logo.wav", Audio::Group::INTERFACE); + so_reproduit_[i] = true; + } + } + } + if (totes_lletres_completes()) { canviar_estat(EstatAnimacio::POST_ANIMATION); } break; + } case EstatAnimacio::POST_ANIMATION: if (temps_estat_actual_ >= DURACIO_POST_ANIMATION) { diff --git a/source/game/escenes/escena_logo.hpp b/source/game/escenes/escena_logo.hpp index 92768e8..21c0668 100644 --- a/source/game/escenes/escena_logo.hpp +++ b/source/game/escenes/escena_logo.hpp @@ -52,6 +52,9 @@ class EscenaLogo { std::vector lletres_; // 9 lletres: J-A-I-L-G-A-M-E-S + // Seguiment de sons de lletres (evitar reproduccions repetides) + std::array so_reproduit_; // Track si cada lletra ja ha reproduit el so + // Constants d'animació static constexpr float DURACIO_PRE = 1.5f; // Duració PRE_ANIMATION (pantalla negra) static constexpr float DURACIO_ZOOM = 4.0f; // Duració del zoom (segons)