diff --git a/data/shapes/ship2.shp b/data/shapes/ship2.shp new file mode 100644 index 0000000..48f8b9f --- /dev/null +++ b/data/shapes/ship2.shp @@ -0,0 +1,24 @@ +# ship2.shp - Nau del jugador (triangle amb base còncava - punta de fletxa) +# © 1999 Visente i Sergi (versió Pascal) +# © 2025 Port a C++20 amb SDL3 + +name: ship2 +scale: 1.0 +center: 0, 0 + +# Triangle amb base còncava tipus "punta de fletxa" +# Punts originals (polar): +# p1: r=12, angle=270° (3π/2) → punta amunt +# p2: r=12, angle=45° (π/4) → base dreta-darrere +# p3: r=12, angle=135° (3π/4) → base esquerra-darrere +# +# MODIFICACIÓ: afegit p4 al mig de la base, desplaçat cap al centre +# p4: (0, 4) → punt central de la base, cap endins +# +# Conversió polar→cartesià (angle-90° perquè origen visual és amunt): +# p1: (0, -12) → punta +# p2: (8.49, 8.49) → base dreta +# p4: (0, 4) → base centre (cap endins) +# p3: (-8.49, 8.49) → base esquerra + +polyline: 0,-12 8.49,8.49 0,4 -8.49,8.49 0,-12 diff --git a/data/sounds/good_job_commander.wav b/data/sounds/good_job_commander.wav new file mode 100644 index 0000000..2c663e2 Binary files /dev/null and b/data/sounds/good_job_commander.wav differ diff --git a/data/voices/good_job_commander.wav b/data/voices/good_job_commander.wav new file mode 100644 index 0000000..2c663e2 Binary files /dev/null and b/data/voices/good_job_commander.wav differ diff --git a/source/core/defaults.hpp b/source/core/defaults.hpp index 1f3d08a..a205882 100644 --- a/source/core/defaults.hpp +++ b/source/core/defaults.hpp @@ -169,10 +169,11 @@ constexpr int FADE_DURATION_MS = 1000; // Fade out duration // Efectes de so (sons puntuals) namespace Sound { -constexpr float VOLUME = 1.0F; // Volumen efectos -constexpr bool ENABLED = true; // Sonidos habilitados -constexpr const char* EXPLOSION = "explosion.wav"; // Explosión -constexpr const char* LASER = "laser_shoot.wav"; // Disparo +constexpr float VOLUME = 1.0F; // Volumen efectos +constexpr bool ENABLED = true; // Sonidos habilitados +constexpr const char* EXPLOSION = "explosion.wav"; // Explosión +constexpr const char* LASER = "laser_shoot.wav"; // Disparo +constexpr const char* GOOD_JOB_COMMANDER = "good_job_commander.wav"; // Voz: "Good job, commander" } // namespace Sound // Enemy type configuration (tipus d'enemics) diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 15b33a2..c45be91 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -165,6 +165,8 @@ auto Director::run() -> int { // Inicialitzar sistema d'audio Audio::init(); + Audio::get()->setMusicVolume(1.0); + Audio::get()->setSoundVolume(0.4); // Precachejar música per evitar lag al començar AudioCache::getMusic("title.ogg"); diff --git a/source/game/entities/nau.cpp b/source/game/entities/nau.cpp index 25be83a..ed67c4d 100644 --- a/source/game/entities/nau.cpp +++ b/source/game/entities/nau.cpp @@ -22,7 +22,7 @@ Nau::Nau(SDL_Renderer* renderer) esta_tocada_(false), brightness_(Defaults::Brightness::NAU) { // [NUEVO] Carregar forma compartida des de fitxer - forma_ = Graphics::ShapeLoader::load("ship.shp"); + forma_ = Graphics::ShapeLoader::load("ship2.shp"); if (!forma_ || !forma_->es_valida()) { std::cerr << "[Nau] Error: no s'ha pogut carregar ship.shp" << std::endl; diff --git a/source/game/escenes/escena_joc.cpp b/source/game/escenes/escena_joc.cpp index e26849a..8239f13 100644 --- a/source/game/escenes/escena_joc.cpp +++ b/source/game/escenes/escena_joc.cpp @@ -244,6 +244,7 @@ void EscenaJoc::actualitzar(float delta_time) { auto& spawn_ctrl = stage_manager_->get_spawn_controller(); if (spawn_ctrl.tots_enemics_destruits(orni_)) { stage_manager_->stage_completat(); + Audio::get()->playSound(Defaults::Sound::GOOD_JOB_COMMANDER, Audio::Group::GAME); break; } } @@ -573,8 +574,8 @@ void EscenaJoc::detectar_col·lisio_nau_enemics() { // [NEW] Stage system helper methods void EscenaJoc::dibuixar_missatge_stage(const std::string& missatge) { - constexpr float escala = 1.5f; - constexpr float spacing = 3.0f; + constexpr float escala = 1.0f; + constexpr float spacing = 2.0f; float text_width = text_.get_text_width(missatge, escala, spacing); float text_height = text_.get_text_height(escala); diff --git a/source/game/escenes/escena_titol.cpp b/source/game/escenes/escena_titol.cpp index 79c1389..b5c49a9 100644 --- a/source/game/escenes/escena_titol.cpp +++ b/source/game/escenes/escena_titol.cpp @@ -411,7 +411,7 @@ void EscenaTitol::dibuixar() { return; } - // Estat MAIN i TRANSITION: Dibuixar títol i text (sobre el starfield) + // 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) { // === Calcular i renderitzar ombra (només si animació activa) === if (animacio_activa_) { @@ -567,7 +567,8 @@ void EscenaTitol::processar_events(const SDL_Event& event) { // Iniciar transició amb fade-out de música estat_actual_ = EstatTitol::TRANSITION_TO_GAME; temps_acumulat_ = 0.0f; // Reset del comptador - Audio::get()->fadeOutMusic(MUSIC_FADE); // Fade de 300ms + Audio::get()->fadeOutMusic(MUSIC_FADE); // Fade + Audio::get()->playSound(Defaults::Sound::LASER, Audio::Group::GAME); break; case EstatTitol::TRANSITION_TO_GAME: