feat(hazard): nou hazard Hole — caiguda per forat amb clip rect

This commit is contained in:
JailDesigner committed 2026-04-30 13:32:17 +02:00
1 parent d4593d0686
commit 4da50571eb
17 files changed
+376 -15

No files matched your search

+23
View File
@@ -88,6 +88,27 @@ class Entity {
[[nodiscard]] auto collides() const -> bool { return collides_; }
[[nodiscard]] auto interactable() const -> bool { return interactable_; }
// Trigger d'àrea: l'entitat NO bloqueja el moviment (`collides_=false`)
// però sí vol rebre `onPlayerContact` quan el jugador la solapa. Pensat
// per a hazards "no físics" (forats al sòl, picos retràctils, plaques
// de pressió). El bucle de contacte (`checkPlayerCollisions`) admet
// l'entitat si compleix `collides_ || triggers_on_overlap_`. El filtre
// d'altura per salt (`height_`) i la caixa de col·lisió funcionen igual.
[[nodiscard]] auto triggersOnOverlap() const -> bool { return triggers_on_overlap_; }
void setTriggersOnOverlap(bool v) { triggers_on_overlap_ = v; }
// Decal de sòl: hazards estàtics sense presència vertical (forats,
// plaques de pressió, charcos). Es pinten ABANS de qualsevol actor
// dins del Y-sort de `GameScene` perquè conceptualment són "pintura
// sobre el tile". Implementació: `getFeetY()` retorna un sentinel
// mínim (`std::numeric_limits<float>::lowest()`) per quedar al
// principi del `stable_sort` ascendent — així no calen passades de
// render extra. Les subclasses (p.ex. `Hole`) poden sobreescriure
// `getFeetY` per saltar-se el sentinel en moments concrets (p.ex.
// un forat que està tragant un jugador i ha de pintar-se al damunt).
[[nodiscard]] auto isFloorDecal() const -> bool { return is_floor_decal_; }
void setFloorDecal(bool v) { is_floor_decal_ = v; }
// Marca per a entitats transitòries: efectes (polvet, espurnes,
// explosions...) que viuen una sola animació i s'autoeliminen quan
// acaba. L'`EntityManager` purga totes les entitats amb `dead_=true`
@@ -172,6 +193,8 @@ class Entity {
std::shared_ptr<Surface> surface_{nullptr};
bool collides_{false};
bool interactable_{false};
bool triggers_on_overlap_{false};
bool is_floor_decal_{false};
int height_{0};
bool dead_{false};
SDL_FlipMode flip_{SDL_FLIP_NONE};