diff --git a/source/game/entities/entity_manager_loadlevel.cpp b/source/game/entities/entity_manager_loadlevel.cpp index b73080f..fba6b3e 100644 --- a/source/game/entities/entity_manager_loadlevel.cpp +++ b/source/game/entities/entity_manager_loadlevel.cpp @@ -65,7 +65,7 @@ void EntityManager::checkPlayerCollisions(const std::vector& players) { const auto BOX = entity->getCollisionRect(); const int E_HEIGHT = entity->getHeight(); for (auto* p : players) { - if (p == nullptr) { continue; } + if (p == nullptr || p->isExited()) { continue; } // Filtre per altura: si el jugador està en l'aire i està per // damunt de l'alçada del cos de l'entitat, no hi ha contacte. // És el mecanisme del salt per esquivar momies, roques, etc. diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index a36b341..c8c3bfb 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -203,6 +203,13 @@ class Player : public AnimatedSprite { state_ = State::EXITED; intended_vx_ = 0.0F; intended_vy_ = 0.0F; + // Important: també resetegem `input_v*` perquè el resolver + // jugador↔jugador (`resolvePlayerVsPlayer`) consulta + // `getInputVX/Y` per decidir si un jugador "es mou". Un EXITED + // amb input fantasma del moment d'entrar a la porta dispararia + // la branca head-on i bloquejaria l'altre jugador en sec. + input_vx_ = 0.0F; + input_vy_ = 0.0F; being_pushed_ = false; } diff --git a/source/game/scenes/game_scene.cpp b/source/game/scenes/game_scene.cpp index 7204e11..7a52f92 100644 --- a/source/game/scenes/game_scene.cpp +++ b/source/game/scenes/game_scene.cpp @@ -113,6 +113,12 @@ namespace { // surt projectat sense control i els dos es travessen. Coincideix // amb la regla d'`Player::collidesWithWorld`. if (a->isHurt() || b->isHurt()) { return; } + // EXITED: el jugador despawnat no és tangible. Si entrés al + // resolver, la seua presència física frenaria l'altre (per + // overlap predictiu) tot i que `applyMovement` és no-op. Sortir + // d'aquí garanteix que el segon jugador pot creuar la porta + // sense interferència del primer ja eixit. + if (a->isExited() || b->isExited()) { return; } // Aire ↔ tierra: el saltador es travessa net del caminant. Sense // resolver, sense head-on, sense push. Els dos continuen amb la