feat(logo): timeline lineal de 7 fases amb glitch tail i durades al YAML
This commit is contained in:
1 parent
7d5a4cee8e
commit
f10671d9c0
7 files changed
+204
-76
No files matched your search
@@ -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_;
|
||||
};
|
||||
Reference in new issue
Block a user