fix(player): EXITED no participa al resolver ni a checkPlayerCollisions
This commit is contained in:
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 auto BOX = entity->getCollisionRect();
|
||||||
const int E_HEIGHT = entity->getHeight();
|
const int E_HEIGHT = entity->getHeight();
|
||||||
for (auto* p : players) {
|
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
|
// 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.
|
// damunt de l'alçada del cos de l'entitat, no hi ha contacte.
|
||||||
// És el mecanisme del salt per esquivar momies, roques, etc.
|
// És el mecanisme del salt per esquivar momies, roques, etc.
|
||||||
|
|||||||
@@ -203,6 +203,13 @@ class Player : public AnimatedSprite {
|
|||||||
state_ = State::EXITED;
|
state_ = State::EXITED;
|
||||||
intended_vx_ = 0.0F;
|
intended_vx_ = 0.0F;
|
||||||
intended_vy_ = 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;
|
being_pushed_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,12 @@ namespace {
|
|||||||
// surt projectat sense control i els dos es travessen. Coincideix
|
// surt projectat sense control i els dos es travessen. Coincideix
|
||||||
// amb la regla d'`Player::collidesWithWorld`.
|
// amb la regla d'`Player::collidesWithWorld`.
|
||||||
if (a->isHurt() || b->isHurt()) { return; }
|
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
|
// Aire ↔ tierra: el saltador es travessa net del caminant. Sense
|
||||||
// resolver, sense head-on, sense push. Els dos continuen amb la
|
// resolver, sense head-on, sense push. Els dos continuen amb la
|
||||||
|
|||||||
Reference in new issue
Block a user