feat(hud): parpadeig configurable als prompts inactius
This commit is contained in:
1 parent
642e0653b2
commit
793e87a203
6 files changed
+43
No files matched your search
@@ -188,6 +188,10 @@ void Hud::update(int delta_ms) {
|
||||
if (b.shake_ms_left > 0) { b.shake_ms_left = std::max(0, b.shake_ms_left - delta_ms); }
|
||||
if (b.flash_ms_left > 0) { b.flash_ms_left = std::max(0, b.flash_ms_left - delta_ms); }
|
||||
}
|
||||
const int CYCLE = UiConfig::get().hudBlinkCycleMs();
|
||||
if (CYCLE > 0) {
|
||||
blink_elapsed_ms_ = (blink_elapsed_ms_ + delta_ms) % CYCLE;
|
||||
}
|
||||
}
|
||||
|
||||
void Hud::setMode(BlockId block, Mode mode) {
|
||||
@@ -238,6 +242,16 @@ auto Hud::computeOffset(const Block& b) -> SDL_FPoint {
|
||||
return off;
|
||||
}
|
||||
|
||||
auto Hud::blinkVisible() const -> bool {
|
||||
const auto& ui = UiConfig::get();
|
||||
const int CYCLE = ui.hudBlinkCycleMs();
|
||||
const float RATIO = ui.hudBlinkVisibleRatio();
|
||||
if (CYCLE <= 0 || RATIO >= 1.0F) { return true; }
|
||||
if (RATIO <= 0.0F) { return false; }
|
||||
const int VISIBLE_MS = static_cast<int>(static_cast<float>(CYCLE) * RATIO);
|
||||
return blink_elapsed_ms_ < VISIBLE_MS;
|
||||
}
|
||||
|
||||
void Hud::render() const {
|
||||
// Backdrop de la franja del HUD. Es pinta abans dels tres blocs perquè,
|
||||
// quan un bloc es mou (entry slide o shake), la zona que deixa al
|
||||
@@ -295,6 +309,7 @@ void Hud::renderIdleSide(int x, int y, int w, const Block& blk, int player_index
|
||||
// el mode fixat per la GameScene cada frame. El render de zeros
|
||||
// queda com a fallback (mode NONE o slot actiu).
|
||||
if (!p.active && p.join_prompt != JoinPromptMode::NONE) {
|
||||
if (!blinkVisible()) { return; }
|
||||
const bool CAN_JOIN = (p.join_prompt == JoinPromptMode::CAN_JOIN);
|
||||
const std::string L1 = Locale::get().text(
|
||||
CAN_JOIN ? "hud.join_prompt_can_join_l1" : "hud.join_prompt_wait_l1");
|
||||
|
||||
@@ -170,6 +170,10 @@ class Hud {
|
||||
// les constants de classe (no toca cap altre membre).
|
||||
[[nodiscard]] static auto computeOffset(const Block& b) -> SDL_FPoint;
|
||||
|
||||
// Estat actual del parpadeig dels prompts inactius. Llegit per
|
||||
// renderIdleSide() per saltar el draw quan toca ocult.
|
||||
[[nodiscard]] auto blinkVisible() const -> bool;
|
||||
|
||||
EventBus& bus_;
|
||||
std::vector<EventBus::SubId> subs_;
|
||||
|
||||
@@ -179,6 +183,10 @@ class Hud {
|
||||
std::array<PlayerStats, 2> players_;
|
||||
int pyramid_{1};
|
||||
int room_{1};
|
||||
// Acumulador continu (ms) per al parpadeig dels prompts inactius.
|
||||
// Es manté entre canvis de mode (CAN_JOIN ↔ WAIT) per evitar salts
|
||||
// visuals i sincronitza els dos slots — vegeu Hud::blinkVisible().
|
||||
int blink_elapsed_ms_{0};
|
||||
// Vides amb què s'arrenca un slot (`activatePlayer`). Cachejat al
|
||||
// ctor des de `Player::death_config.initial_lives` per no llegir el
|
||||
// singleton estàtic en el camí calent del bus de events.
|
||||
|
||||
Reference in new issue
Block a user