#include "game/entities/concrete/hole.hpp" #include #include #include "game/entities/entity_factory.hpp" #include "game/entities/player.hpp" Hole::Hole(const fkyaml::node& yaml) { name_ = yaml.contains("name") ? yaml["name"].get_value() : std::string("hole"); // Sense xoc físic ni interacció — només trigger d'àrea. El bucle de // contacte ens admet via `triggers_on_overlap_=true`. Damage queda a // 0 (no publiquem `player_hit`); la mort la dispara `integrateJump` // del jugador quan supera `HOLE_FALL_DEPTH`. collides_ = false; interactable_ = false; triggers_on_overlap_ = true; // Decal de sòl: `Entity::getFeetY()` torna sentinel mínim si aquest // flag està actiu — així el forat es pinta abans que qualsevol actor. is_floor_decal_ = true; setDamage(0); } void Hole::onPlayerContact(Player* player) { if (player == nullptr) { return; } // Només mossega quan el jugador trepitja el forat de peu (GROUNDED). // En l'aire, el filtre d'altura del bucle ja l'ha rebutjat (height_=0 // i jump_z_>0 prou per superar-ho); però mantenim el gat per defensa // 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. 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; } // Snap al centre XY del forat + Y de la base del tile (per al clip // rect del sprite mentre cau). `enterHoleFall` rep coordenades // absolutes en el canvas — el player s'encarrega de convertir a la // seua convenció (cantó superior-esquerra del sprite). const float CENTER_X = BOX.x + (BOX.w * 0.5F); const float CENTER_Y = BOX.y + (BOX.h * 0.5F); const float FLOOR_Y = BOX.y + BOX.h; player->enterHoleFall(CENTER_X, CENTER_Y, FLOOR_Y); } REGISTER_ENTITY("hole", Hole)