feat(lighting): offset del centre de la llum per emissor

This commit is contained in:
JailDesigner committed 2026-05-13 18:26:19 +02:00
1 parent dacc4a9909
commit 3a42c7958a
9 files changed
+114 -25

No files matched your search

+25 -5
View File
@@ -280,6 +280,22 @@ class Entity {
light_color_b_ = b;
}
// Desplaçament en píxels del centre del cercle de llum respecte el
// centre visual del sprite (que és el que retornaria per defecte
// `getLightCenter`). Útil quan el "punt de llum" iconogràfic no
// coincideix amb el centre del bounding box — per exemple, la flama
// d'una antorxa està a la part de dalt del sprite i interessa pujar
// l'emissor 3-4 px per a que el cercle de llum surti de la flama,
// no del peu. Y creix cap avall al canvas, així que `y: -3` puja
// la llum 3 píxels. Cadena de resolució idèntica al color: tipus →
// sala → spawn.
[[nodiscard]] auto getLightOffsetX() const -> int { return light_offset_x_; }
[[nodiscard]] auto getLightOffsetY() const -> int { return light_offset_y_; }
void setLightOffset(int x, int y) {
light_offset_x_ = x;
light_offset_y_ = y;
}
// Identificador estable per al flicker. Cada Entity rep un valor
// únic a la construcció (contador estàtic) i el conserva fins a la
// mort — així el patró del flicker no "deriva" quan l'entitat es
@@ -288,11 +304,13 @@ class Entity {
// un problema.
[[nodiscard]] auto getLightSeed() const -> int { return light_seed_; }
// Centre de la llum en píxels del canvas. Per defecte és el centre del
// `pixel_rect_` (que és la caixa de render: sprite top-left + mida).
// Virtual perquè entitats amb desplaçament visual sobre la posició
// lògica (p.ex. el Player en l'aire, que rebaixa visualment `pos_.y`
// amb `jump_z_`) puguin retornar el centre que realment es veu.
// Centre de la llum en píxels del canvas. Per defecte és el centre
// del `pixel_rect_` (caixa de render) més l'offset configurat al
// YAML (`light.offset: [x, y]`). Virtual perquè entitats amb
// desplaçament visual sobre la posició lògica (p.ex. el Player en
// l'aire, que rebaixa visualment `pos_.y` amb `jump_z_`) puguin
// retornar el centre que realment es veu — l'override n'és
// responsable d'incloure l'offset (com fa `Player::getLightCenter`).
[[nodiscard]] virtual auto getLightCenter() const -> SDL_FPoint;
protected:
@@ -319,6 +337,8 @@ class Entity {
std::uint8_t light_color_r_{255};
std::uint8_t light_color_g_{255};
std::uint8_t light_color_b_{255};
int light_offset_x_{0};
int light_offset_y_{0};
bool dead_{false};
SDL_FlipMode flip_{SDL_FLIP_NONE};
EventBus* bus_{nullptr};