feat(hazard): nou hazard Hole — caiguda per forat amb clip rect
This commit is contained in:
1 parent
d4593d0686
commit
4da50571eb
17 files changed
+376
-15
No files matched your search
@@ -61,7 +61,12 @@ void EntityManager::renderAll() {
|
||||
void EntityManager::checkPlayerCollisions(const std::vector<Player*>& players) {
|
||||
if (players.empty()) { return; }
|
||||
for (const auto& entity : entities_) {
|
||||
if (!entity->collides()) { continue; }
|
||||
// Acceptem entitats sòlides (xoc físic) i triggers d'àrea (no
|
||||
// bloquegen però volen rebre `onPlayerContact`). Tanquem el gap
|
||||
// latent de FloorTrap/WallTrap (que tenien `collides_=false` i
|
||||
// mai no es disparaven) i obrim la porta a hazards no-físics
|
||||
// com `Hole`.
|
||||
if (!entity->collides() && !entity->triggersOnOverlap()) { continue; }
|
||||
const auto BOX = entity->getCollisionRect();
|
||||
const int E_HEIGHT = entity->getHeight();
|
||||
for (auto* p : players) {
|
||||
@@ -69,6 +74,10 @@ void EntityManager::checkPlayerCollisions(const std::vector<Player*>& players) {
|
||||
// contacte amb hazards (un segon toc de mòmia mentre la roda
|
||||
// ja és no-op; cap altra entitat l'ha de fer transicionar).
|
||||
if (p == nullptr || p->isOutOfPlay() || p->isDying()) { continue; }
|
||||
// Mentre el jugador cau per un forat, ignorem qualsevol altre
|
||||
// hazard: la transició a `enterDying()` ja la dispara
|
||||
// `integrateJump` quan supera `HOLE_FALL_DEPTH`.
|
||||
if (p->isFallingThroughHole()) { 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.
|
||||
|
||||
Reference in new issue
Block a user