feat(logo): timeline lineal de 7 fases amb glitch tail i durades al YAML

This commit is contained in:
JailDesigner committed 2026-05-07 16:44:34 +02:00
1 parent 7d5a4cee8e
commit f10671d9c0
7 files changed
+204 -76

No files matched your search

+26 -23
View File
@@ -9,14 +9,22 @@
class Surface;
// Escena del logotip de l'editora. FSM amb tres fases visibles:
// `SCAN` — revelat tipus scanline CRT (durada YAML, ~1500 ms)
// `MIDDLE` — logo estable (`MIDDLE_MS`, 5 s)
// `FADE_OUT` — fade lineal a negre (`FADE_OUT_MS`, 500 ms)
// I una terminal `DONE` que dispara la transició cap a TITLE. A 2,5 s
// dins de `MIDDLE` arrenca la música del títol perquè entri al cor de
// l'escena i continue cap a TitleScene sense talls (Audio ja és
// idempotent quan es demana la mateixa pista que ja sona).
// Escena del logotip de l'editora. Timeline lineal en 7 fases visibles
// (durades configurables des de `logo.timeline.*` al YAML, excepte SCAN
// que la marca `logo.scan.duration_ms` + `tail_glitch_ms` + `flash_ms`):
//
// `BLACK_INTRO` — negre pur abans d'arrencar res.
// `SCAN` — revelat scanline CRT amb glitch tail. So
// `logoGlitchSound` es dispara just al començar
// aquesta fase (no al constructor).
// `HOLD_SILENT` — logo estable, en silenci, marge entre el final
// del glitch i l'arrencada de la música.
// `HOLD_MUSIC` — logo estable amb la música del títol sonant.
// `FADE_OUT` — fade lineal a negre.
// `BLACK_OUTRO` — negre amb la música encara sonant. TitleScene
// continuarà la pista de manera idempotent (Audio
// detecta same-track + same-loop i no reinicia).
// `DONE` — terminal; dispara la transició cap a TITLE.
//
// Skip: qualsevol tecla no reservada salta directament a la transició
// (sense fade-out) — el TitleScene té el seu propi `intro.fade_in_ms`,
@@ -27,14 +35,6 @@ class Surface;
// silenciós encara que veníssem del joc en marxa.
class LogoScene : public Scene {
public:
static constexpr int MIDDLE_MS = 5000;
static constexpr int FADE_OUT_MS = 500;
// Offset dins de MIDDLE en què comença a sonar la pista del títol;
// triat perquè quedi clarament al cor de la fase central (logo
// estable) i prou abans del fade-out per donar continuïtat sonora a
// TitleScene.
static constexpr int MUSIC_TRIGGER_MS = 2500;
LogoScene(std::shared_ptr<Surface> logo, bool reset);
~LogoScene() override;
@@ -42,22 +42,25 @@ class LogoScene : public Scene {
void render() override;
private:
enum class Phase : std::uint8_t { SCAN,
MIDDLE,
enum class Phase : std::uint8_t { BLACK_INTRO,
SCAN,
HOLD_SILENT,
HOLD_MUSIC,
FADE_OUT,
BLACK_OUTRO,
DONE };
void enterMiddle();
void enterScan();
void enterHoldSilent();
void enterHoldMusic();
void enterFadeOut();
void enterBlackOutro();
void enterDone();
[[nodiscard]] static auto wantsSkip() -> bool;
std::shared_ptr<Surface> logo_;
Phase phase_{Phase::SCAN};
Phase phase_{Phase::BLACK_INTRO};
int phase_elapsed_ms_{0};
bool music_started_{false};
// Capa de fosa per al FADE_OUT cap a TITLE. El FADE_IN inicial s'ha
// substituït per `scan_` (revelat CRT amb glitch).
Transitions::FadeToBlack fade_;
Effects::ScanReveal scan_;
};