From 3646e6a4aaf76749af8a481aeb909e60726c00fd Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sat, 25 Apr 2026 13:50:30 +0200 Subject: [PATCH] feat(player): efectes de so configurables al despegue i a l'aterratge --- data/player/morcus.yaml | 5 +++++ data/player/sam.yaml | 5 +++++ source/game/entities/player.cpp | 18 ++++++++++++++++++ source/game/entities/player.hpp | 2 ++ 4 files changed, 30 insertions(+) diff --git a/data/player/morcus.yaml b/data/player/morcus.yaml index 7f8b148..1bcb827 100644 --- a/data/player/morcus.yaml +++ b/data/player/morcus.yaml @@ -85,6 +85,9 @@ turn: # puja). Compensa la franja transparent que els # sprites del jugador tenen sota els peus reals # perquè camine "pel mig del passadís" (3 px aquí). +# sound → fitxer .wav reproduït al despegue (relatiu a +# data/sounds/). Buit o absent = sense so. +# land_sound → fitxer .wav reproduït en aterrar. # L'alçada del cos viu al bloc `collision:` (`height`), igual que la resta # d'entitats: és una propietat de col·lisió, no de la física del salt. # Amb impulse=240 i gravity=600: pic ≈ 48 px, temps total en l'aire ≈ 0.8 s. @@ -93,3 +96,5 @@ jump: gravity: 600 landing_stun_ms: 200 shadow_y_offset: 3 + sound: jump.wav + land_sound: land.wav diff --git a/data/player/sam.yaml b/data/player/sam.yaml index f27a872..80bdcb6 100644 --- a/data/player/sam.yaml +++ b/data/player/sam.yaml @@ -85,6 +85,9 @@ turn: # puja). Compensa la franja transparent que els # sprites del jugador tenen sota els peus reals # perquè camine "pel mig del passadís" (3 px aquí). +# sound → fitxer .wav reproduït al despegue (relatiu a +# data/sounds/). Buit o absent = sense so. +# land_sound → fitxer .wav reproduït en aterrar. # L'alçada del cos viu al bloc `collision:` (`height`), igual que la resta # d'entitats: és una propietat de col·lisió, no de la física del salt. # Amb impulse=240 i gravity=600: pic ≈ 48 px, temps total en l'aire ≈ 0.8 s. @@ -93,3 +96,5 @@ jump: gravity: 600 landing_stun_ms: 200 shadow_y_offset: 3 + sound: jump.wav + land_sound: land.wav diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index 384f037..ac5b928 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -7,6 +7,7 @@ #include #include +#include "core/audio/audio.hpp" #include "core/input/gamepad_manager.hpp" #include "core/input/input_state.hpp" #include "core/rendering/screen.hpp" @@ -147,6 +148,17 @@ void Player::readJumpBlock(const fkyaml::node& yaml) { if (j.contains("gravity")) { jump_config.gravity_px_per_s2 = j["gravity"].get_value(); } if (j.contains("landing_stun_ms")) { jump_config.landing_stun_ms = j["landing_stun_ms"].get_value(); } if (j.contains("shadow_y_offset")) { jump_config.shadow_y_offset = j["shadow_y_offset"].get_value(); } + // Sons opcionals: el nom del fitxer (relatiu a data/sounds/) val tant + // de clau al Resource::Cache com de basename per a la càrrega. Si el + // camp manca, la clau queda buida i `playSound` no es crida. + if (j.contains("sound")) { + jump_config.sound_key = j["sound"].get_value(); + Resource::Cache::get().loadSound(jump_config.sound_key, "data/sounds/" + jump_config.sound_key); + } + if (j.contains("land_sound")) { + jump_config.land_sound_key = j["land_sound"].get_value(); + Resource::Cache::get().loadSound(jump_config.land_sound_key, "data/sounds/" + jump_config.land_sound_key); + } } void Player::applyCardinal(Cardinal c) { @@ -492,6 +504,9 @@ void Player::startJump() { state_ = State::AIRBORNE; jump_z_ = 0.0F; jump_vz_ = jump_config.impulse_px_per_s; + if (!jump_config.sound_key.empty() && Audio::get() != nullptr) { + Audio::get()->playSound(jump_config.sound_key, Audio::Group::GAME); + } // Prou: la velocitat horitzontal del salt és la `intended_v*` actual // (input del frame). El facing també queda com està. Ja no es // tocaran fins a aterrar. @@ -506,6 +521,9 @@ auto Player::integrateJump(float delta_time) -> bool { jump_vz_ = 0.0F; state_ = State::LANDING_STUN; landing_stun_remaining_ms_ = static_cast(jump_config.landing_stun_ms); + if (!jump_config.land_sound_key.empty() && Audio::get() != nullptr) { + Audio::get()->playSound(jump_config.land_sound_key, Audio::Group::GAME); + } return true; } return false; diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index 1c03318..d254ed1 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -371,6 +371,8 @@ class Player : public AnimatedSprite { float gravity_px_per_s2{0.0F}; // Acceleració descendent constant. int landing_stun_ms{0}; // Stun en aterrar (no es mou ni salta). int shadow_y_offset{0}; // Px que puja la sombra (compensa transparències al peu del sprite). + std::string sound_key; // Clau al Resource::Cache del so de despegue (buit = silenci). + std::string land_sound_key; // Clau del so d'aterratge (buit = silenci). }; static JumpConfig jump_config;