fix(hazard): el jugador només cau al Hole si la hit-box hi cap del tot

This commit is contained in:
JailDesigner committed 2026-04-30 16:56:56 +02:00
1 parent 3bfca35f3a
commit 1ccd444aad
1 file changed
+8 -5
+8 -5
View File
@@ -30,13 +30,16 @@ void Hole::onPlayerContact(Player* player) {
// davant de futurs canvis al filtre. // davant de futurs canvis al filtre.
if (player->getState() != Player::State::GROUNDED) { return; } if (player->getState() != Player::State::GROUNDED) { return; }
// Re-verificació estricta amb la hit-box interna del jugador (8×8): // Re-verificació estricta: la hit-box interna del jugador (8×8) ha
// així el contacte només es dispara quan el centre del jugador ha // d'estar COMPLETAMENT continguda dins del rect del forat (16×16). El
// entrat al tile del forat, no quan només el frega per la vora. // 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 HIT = player->getHitBox();
const SDL_FRect BOX = getCollisionRect(); 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; 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 (!OVERLAP) { return; } if (!CONTAINED) { return; }
// Snap al centre XY del forat + Y de la base del tile (per al clip // Snap al centre XY del forat + Y de la base del tile (per al clip
// rect del sprite mentre cau). `enterHoleFall` rep coordenades // rect del sprite mentre cau). `enterHoleFall` rep coordenades