feat(lighting): flicker tipus foc per antorxes
This commit is contained in:
1 parent
3195746189
commit
35aaa6c519
8 files changed
+124
-16
No files matched your search
@@ -259,6 +259,13 @@ class Entity {
|
||||
[[nodiscard]] auto getLightRadius() const -> int { return light_radius_; }
|
||||
void setLightRadius(int r) { light_radius_ = r; }
|
||||
|
||||
// Activa la modulació "tipus foc" del radi a la pasada d'il·luminació
|
||||
// (per a antorxes, fogueres, etc.). El bloc opcional
|
||||
// `light: { flicker: true }` del YAML el pobla. Per defecte false:
|
||||
// la llum queda perfectament estable (cas player, mòmia).
|
||||
[[nodiscard]] auto getLightFlicker() const -> bool { return light_flicker_; }
|
||||
void setLightFlicker(bool f) { light_flicker_ = f; }
|
||||
|
||||
// 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ó
|
||||
@@ -280,6 +287,7 @@ class Entity {
|
||||
bool blocks_movement_{false};
|
||||
int height_{0};
|
||||
int light_radius_{0};
|
||||
bool light_flicker_{false};
|
||||
bool dead_{false};
|
||||
SDL_FlipMode flip_{SDL_FLIP_NONE};
|
||||
EventBus* bus_{nullptr};
|
||||
|
||||
@@ -155,15 +155,23 @@ namespace {
|
||||
return c["height"].get_value<int>();
|
||||
}
|
||||
|
||||
// Bloc opcional `light: { radius: N }` de la plantilla. Si manca, el
|
||||
// radi és 0 i l'entitat no entra a la pasada d'il·luminació. La forma
|
||||
// del gradient (3 anells) viu a data/config/lighting.yaml — no cal
|
||||
// declarar-la per entitat.
|
||||
auto readLightRadius(const fkyaml::node& tmpl) -> int {
|
||||
if (!tmpl.contains("light")) { return 0; }
|
||||
// Bloc opcional `light: { radius: N, flicker: bool }` de la plantilla.
|
||||
// Si manca, el radi és 0 i l'entitat no entra a la pasada d'il·luminació.
|
||||
// `flicker` activa la modulació "tipus foc" del radi (només antorxes
|
||||
// l'haurien d'usar). La forma del gradient (3 anells) i els paràmetres
|
||||
// del flicker viuen a data/config/lighting.yaml — no cal declarar-los
|
||||
// per entitat.
|
||||
struct LightTemplate {
|
||||
int radius{0};
|
||||
bool flicker{false};
|
||||
};
|
||||
auto readLight(const fkyaml::node& tmpl) -> LightTemplate {
|
||||
if (!tmpl.contains("light")) { return {}; }
|
||||
const auto& l = tmpl["light"];
|
||||
if (!l.contains("radius")) { return 0; }
|
||||
return l["radius"].get_value<int>();
|
||||
LightTemplate out;
|
||||
if (l.contains("radius")) { out.radius = l["radius"].get_value<int>(); }
|
||||
if (l.contains("flicker")) { out.flicker = l["flicker"].get_value<bool>(); }
|
||||
return out;
|
||||
}
|
||||
|
||||
// Bloc `collision: { size: [w, h], base_size: [bw, bh]?, offset: [x, y]? }`
|
||||
@@ -288,7 +296,9 @@ namespace {
|
||||
entity->setCollisionBox(*BOX);
|
||||
}
|
||||
entity->setHeight(readHeight(tmpl));
|
||||
entity->setLightRadius(readLightRadius(tmpl));
|
||||
const auto LIGHT = readLight(tmpl);
|
||||
entity->setLightRadius(LIGHT.radius);
|
||||
entity->setLightFlicker(LIGHT.flicker);
|
||||
anchor_out = readAnchor(tmpl);
|
||||
return entity;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user