feat(entities): bloc collision i anchor:feet per entitats amb falsa perspectiva
This commit is contained in:
1 parent
1af5ef861f
commit
e6b612d164
7 files changed
+162
-5
No files matched your search
@@ -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};
|
||||
|
||||
Reference in new issue
Block a user