fix(player): EXITED no participa al resolver ni a checkPlayerCollisions

This commit is contained in:
JailDesigner committed 2026-04-26 10:41:05 +02:00
1 parent 178ce486c2
commit cd5bb94223
3 files changed
+14 -1

No files matched your search

@@ -65,7 +65,7 @@ void EntityManager::checkPlayerCollisions(const std::vector<Player*>& 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.
+7
View File
@@ -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;
}
+6
View File
@@ -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