From 1ccd444aade35e01983374eb176e762d721aeef5 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 30 Apr 2026 16:56:56 +0200 Subject: [PATCH] =?UTF-8?q?fix(hazard):=20el=20jugador=20nom=C3=A9s=20cau?= =?UTF-8?q?=20al=20Hole=20si=20la=20hit-box=20hi=20cap=20del=20tot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/game/entities/concrete/hole.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/source/game/entities/concrete/hole.cpp b/source/game/entities/concrete/hole.cpp index 4d3092c..2aa3bdf 100644 --- a/source/game/entities/concrete/hole.cpp +++ b/source/game/entities/concrete/hole.cpp @@ -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