feat(player): so de hurt al morir + respawn cinemàtic amb limbo invisible

This commit is contained in:
JailDesigner committed 2026-04-29 12:15:52 +02:00
1 parent 9f0a566ffb
commit 38070b33aa
1 file changed
+20 -5
+20 -5
View File
@@ -1075,6 +1075,13 @@ void Player::enterDying() {
death_animation_complete_ = false;
respawn_remaining_ms_ = 0.0F;
setCurrentAnimation("death_spinning");
// So del cop letal: reaprofitem `hurt.wav` (ja precarregat per
// `readHurtBlock`). El bloc `death:` no té camp de so propi —
// semànticament l'impacte mortal és la versió forta de `hurt`.
if (!hurt_config.sound_key.empty() && Audio::get() != nullptr) {
Audio::get()->playSound(hurt_config.sound_key, Audio::Group::GAME);
}
}
void Player::applyDyingMovement(float delta_time) {
@@ -1101,11 +1108,12 @@ void Player::respawnFromDying() {
--lives_remaining_;
death_animation_complete_ = false;
respawn_remaining_ms_ = 0.0F;
// `respawn` reseteja l'estat (GROUNDED, facing SOUTH, animació
// `stand_south`) i mou el sprite a les coords del spawn que el
// GameScene ha assignat. No fem `spawnFromAir` per disseny: el
// respawn post-mort és sec, sense cinemàtica de caiguda.
respawn(spawn_x_, spawn_y_);
// Cinemàtica idèntica a la d'INTRO de sala: el jugador cau des de
// dalt fins al passadís d'spawn (`spawnFromAir` reseteja primer i
// després posa AIRBORNE amb l'altura derivada de la geometria).
// Així el respawn post-mort comparteix tota la sensació visual i
// física del primer spawn — incloent el LANDING_STUN final.
spawnFromAir(spawn_x_, spawn_y_);
}
void Player::applyHurtMovement(float delta_time) {
@@ -1160,6 +1168,13 @@ void Player::render() {
// vector.
if (isOutOfPlay()) { return; }
// Limbo post-mort: durant `respawn_delay_ms` entre la fi de
// `death_spinning` i el `spawnFromAir`, el jugador queda invisible.
// Així el cicle complet és: animació rodant → desapareix → ressuscita
// caient des de dalt. Sense aquest gat, el sprite quedaria pintat al
// darrer frame de la roda mentre passa el delay.
if (state_ == State::DYING && death_animation_complete_) { return; }
// Mentre el jugador està enlaire, el sprite es desplaça visualment
// cap amunt `jump_z_` píxels. Modifiquem `pos_.y` (la posició entera
// de render) abans de cridar el render base, i la restaurem després