feat(title): fade-in inicial de negre a escena (500 ms, configurable a ui.yaml)

This commit is contained in:
JailDesigner committed 2026-05-06 19:34:59 +02:00
1 parent 29cb4c2211
commit 1431f27cfa
6 files changed
+36

No files matched your search

+16
View File
@@ -101,6 +101,10 @@ TitleScene::TitleScene(std::shared_ptr<Text> display_font, std::shared_ptr<Text>
.max_block_size = UiConfig::get().titleFadeOutMaxBlock(),
});
attract_fade_.emplace();
// Fade-in inicial: arrenquem en negre opac i ens esvaïm cap a la
// imatge de fons. Sense lligar a cap fase — viu sempre al frame i
// un cop finished, `render()` és no-op fins que la TitleScene mor.
intro_fade_.begin(UiConfig::get().titleIntroFadeInMs(), Transitions::FadeToBlack::Direction::FADE_IN);
// Música de fons en bucle. Es preloda al Director, així que la
// primera crida és immediata. El fade-out arrenca en entrar a
@@ -122,6 +126,11 @@ void TitleScene::update(int delta_ms) {
if (heat_haze_) { heat_haze_->tick(delta_ms); }
// Fade-in inicial: tica sempre. Un cop finished, FadeToBlack::tick
// és idempotent (clamp intern al duration_ms_) i `render()` pinta
// alpha=0 (no-op) durant la resta del cicle.
intro_fade_.tick(delta_ms);
// Comptador del parpadeig: avança sempre amb `delta_ms` cru. La
// lectura (cicle/visible) la decideix `render()` segons la fase:
// IDLE usa visible_ms / hidden_ms del yaml (asimètric, 80/20 per
@@ -336,6 +345,13 @@ void TitleScene::render() {
Notifier::get().render();
// Fade-in inicial: capa negra que s'esvaeix cap a l'escena durant
// els primers `title.intro_fade_in_ms` ms. `render()` és no-op un
// cop finished, així que es queda penjat aquí sense lògica
// condicional. Va per damunt del Notifier — coherent amb la resta
// de transicions — però per davall del RenderInfo de debug.
intro_fade_.render();
// Capa de transició final segons la fase. Sempre cobreix l'escena
// i el Notifier, mai el RenderInfo (overlay de debug, sempre
// visible). STARTING usa mosaic dissolve; ATTRACT_OUT, fade-to-black