fix(hazard): el jugador només cau al Hole si la hit-box hi cap del tot
This commit is contained in:
1 parent
3bfca35f3a
commit
1ccd444aad
1 file changed
+8
-5
@@ -30,13 +30,16 @@ void Hole::onPlayerContact(Player* player) {
|
||||
// davant de futurs canvis al filtre.
|
||||
if (player->getState() != Player::State::GROUNDED) { return; }
|
||||
|
||||
// Re-verificació estricta amb la hit-box interna del jugador (8×8):
|
||||
// així el contacte només es dispara quan el centre del jugador ha
|
||||
// entrat al tile del forat, no quan només el frega per la vora.
|
||||
// Re-verificació estricta: la hit-box interna del jugador (8×8) ha
|
||||
// d'estar COMPLETAMENT continguda dins del rect del forat (16×16). El
|
||||
// bucle de col·lisió del manager ja ens ha cridat per qualsevol solape;
|
||||
// ací filtrem perquè la caiguda només es dispari quan els "dos peus"
|
||||
// estan dins del forat, no quan només la vora frega — sinó es percep
|
||||
// com un imant que succiona el jugador al centre.
|
||||
const SDL_FRect HIT = player->getHitBox();
|
||||
const SDL_FRect BOX = getCollisionRect();
|
||||
const bool OVERLAP = HIT.x + HIT.w > BOX.x && BOX.x + BOX.w > HIT.x && HIT.y + HIT.h > BOX.y && BOX.y + BOX.h > HIT.y;
|
||||
if (!OVERLAP) { return; }
|
||||
const bool CONTAINED = HIT.x >= BOX.x && HIT.y >= BOX.y && HIT.x + HIT.w <= BOX.x + BOX.w && HIT.y + HIT.h <= BOX.y + BOX.h;
|
||||
if (!CONTAINED) { return; }
|
||||
|
||||
// Snap al centre XY del forat + Y de la base del tile (per al clip
|
||||
// rect del sprite mentre cau). `enterHoleFall` rep coordenades
|
||||
|
||||
Reference in new issue
Block a user