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; death_animation_complete_ = false;
respawn_remaining_ms_ = 0.0F; respawn_remaining_ms_ = 0.0F;
setCurrentAnimation("death_spinning"); 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) { void Player::applyDyingMovement(float delta_time) {
@@ -1101,11 +1108,12 @@ void Player::respawnFromDying() {
--lives_remaining_; --lives_remaining_;
death_animation_complete_ = false; death_animation_complete_ = false;
respawn_remaining_ms_ = 0.0F; respawn_remaining_ms_ = 0.0F;
// `respawn` reseteja l'estat (GROUNDED, facing SOUTH, animació // Cinemàtica idèntica a la d'INTRO de sala: el jugador cau des de
// `stand_south`) i mou el sprite a les coords del spawn que el // dalt fins al passadís d'spawn (`spawnFromAir` reseteja primer i
// GameScene ha assignat. No fem `spawnFromAir` per disseny: el // després posa AIRBORNE amb l'altura derivada de la geometria).
// respawn post-mort és sec, sense cinemàtica de caiguda. // Així el respawn post-mort comparteix tota la sensació visual i
respawn(spawn_x_, spawn_y_); // física del primer spawn — incloent el LANDING_STUN final.
spawnFromAir(spawn_x_, spawn_y_);
} }
void Player::applyHurtMovement(float delta_time) { void Player::applyHurtMovement(float delta_time) {
@@ -1160,6 +1168,13 @@ void Player::render() {
// vector. // vector.
if (isOutOfPlay()) { return; } 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 // Mentre el jugador està enlaire, el sprite es desplaça visualment
// cap amunt `jump_z_` píxels. Modifiquem `pos_.y` (la posició entera // 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 // de render) abans de cridar el render base, i la restaurem després