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