feat(title): seqüència d'intro temporitzada amb slide-in del peu

This commit is contained in:
JailDesigner committed 2026-05-07 13:08:13 +02:00
1 parent fceeb11cdd
commit 243ced7498
7 files changed
+226 -75

No files matched your search

+18 -1
View File
@@ -8,6 +8,7 @@
#include "core/rendering/transitions/fade_to_black.hpp"
#include "core/rendering/transitions/mosaic.hpp"
#include "core/scene/scene.hpp"
#include "core/ui/ui_config.hpp"
#include "game/debug_config.hpp"
class Surface;
@@ -49,6 +50,14 @@ class TitleScene : public Scene {
void advanceToIntro(DebugConfig::StartingPlayers players);
void advanceToLogo();
// Helpers de `render()` extrets per evitar que la funció gran acumuli
// massa branques. Cadascun pinta un bloc independent del frame.
void renderBackground();
void renderGameLogo(const UiConfig::TitleIntro& intro);
void renderPressStart(const UiConfig::TitleIntro& intro);
void renderFooter(const UiConfig::TitleIntro& intro);
void renderTransitions();
std::shared_ptr<Text> condensed_font_;
std::shared_ptr<Text> copyright_font_;
std::shared_ptr<Surface> background_;
@@ -56,6 +65,14 @@ class TitleScene : public Scene {
std::shared_ptr<Surface> mini_logo_;
int timer_ms_;
int blink_elapsed_ms_{0};
// Rellotge de la seqüència d'intro (vegeu `title.intro` a ui.yaml).
// Avança sempre amb `delta_ms`. La visibilitat i el slide de cada
// element es deriven d'ell a `render()` — no cal cap altre estat.
int intro_elapsed_ms_{0};
// Detector de l'instant en què `intro_elapsed_ms_` creua per primera
// vegada `press_start_at_ms`: en aquell frame es reseteja
// `blink_elapsed_ms_` perquè el text aparegui en estat visible.
bool press_start_armed_{false};
std::optional<Effects::HeatHaze> heat_haze_;
Phase phase_{Phase::IDLE};
int starting_timer_ms_{0};
@@ -63,7 +80,7 @@ class TitleScene : public Scene {
std::optional<Transitions::Mosaic> fade_out_;
std::optional<Transitions::FadeToBlack> attract_fade_;
// Fade-in inicial: capa negra que s'esvaeix cap a la imatge de fons
// durant els primers `title.intro_fade_in_ms` ms. Sempre activa al
// durant els primers `title.intro.fade_in_ms` ms. Sempre activa al
// ctor; un cop finished, `render()` pinta alpha=0 (no-op) la resta
// del cicle de l'escena.
Transitions::FadeToBlack intro_fade_;