feat(entities): bloc collision i anchor:feet per entitats amb falsa perspectiva

This commit is contained in:
JailDesigner committed 2026-04-21 19:39:02 +02:00
1 parent 1af5ef861f
commit e6b612d164
7 files changed
+162 -5

No files matched your search

+29
View File
@@ -37,6 +37,18 @@ class Entity {
int row{0};
};
// Sub-rectangle de col·lisió dins de `pixel_rect_`. Pensat per a
// personatges amb falsa perspectiva (sprite alt, caixa AABB petita
// encastada a baix) — mateixa convenció que el Player. `offset_x/y`
// són relatius a la cantonada superior-esquerra del sprite. Si l'entitat
// no té `CollisionBox`, `getCollisionRect()` retorna tot el `pixel_rect_`.
struct CollisionBox {
int offset_x{0};
int offset_y{0};
int width{0};
int height{0};
};
Entity() = default;
Entity(std::string name, TilePos tile, SDL_FRect pixel_rect);
virtual ~Entity() = default;
@@ -100,11 +112,28 @@ class Entity {
// Entitats sense animació retornen `nullopt` → frame 0 per defecte.
[[nodiscard]] auto getAnimation() const -> const std::optional<AnimationComponent>& { return anim_; }
// Caixa de col·lisió: per defecte és el `pixel_rect_` sencer (entitats
// AABB-aligned). Si s'ha configurat un `CollisionBox`, retorna el
// sub-rect dins del sprite — vida útil: validar col·lisions amb el
// jugador o el mapa sense que la caixa inclogui "l'alçada" del sprite.
[[nodiscard]] auto getCollisionRect() const -> SDL_FRect;
// Y dels peus: la vora inferior de la caixa de col·lisió. La usarà el
// Z-order per ordenar entitats i jugador de menys a més profunditat
// (REND-01, quan s'implemente).
[[nodiscard]] auto getFeetY() const -> float;
// El loader li assigna una caixa explícita llegida del YAML; sense
// aquesta crida, l'entitat queda sense `CollisionBox` i la caixa de
// col·lisió coincideix amb el sprite.
void setCollisionBox(CollisionBox box) { collision_box_ = box; }
protected:
std::string name_;
TilePos tile_{};
SDL_FRect pixel_rect_{};
std::optional<AnimationComponent> anim_;
std::optional<CollisionBox> collision_box_;
std::shared_ptr<Surface> surface_{nullptr};
bool collides_{false};
bool interactable_{false};