feat(demo): transició títol→demo amb dive de càmera + cortinilla negra (substitueix el fundido)

This commit is contained in:
2026-05-29 10:03:17 +02:00
parent 068f42782b
commit 2f6d6c405f
9 changed files with 204 additions and 145 deletions
+8 -7
View File
@@ -56,7 +56,7 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context)
starfield_parallax_(sdl.getRenderer()),
playfield_(sdl.getRenderer()),
border_(sdl.getRenderer()),
fade_(sdl.getRenderer()) {
curtain_(sdl.getRenderer()) {
// Recuperar configuración de match des del context
match_config_ = context_.getMatchConfig();
@@ -171,8 +171,9 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context)
Audio::get()->enableSound(false);
// El fons (graella) ha d'aparèixer ja muntat: la demo és una partida en marxa.
playfield_.completeBuild();
// Fosa des de negre sobre el joc ja en marxa (transició suau des del títol).
fade_.start(1.0F, 0.0F, Defaults::Game::Fade::DEMO_IN_DURATION);
// La cortinilla arrenca tapant i cau per destapar la demo (continua el
// moviment iniciat al títol, que va acabar amb la pantalla negra).
curtain_.reveal(Defaults::Game::Curtain::REVEAL_DURATION);
} else {
stage_manager_->init();
}
@@ -366,7 +367,7 @@ void GameScene::updateShipsControl(float delta_time) {
}
auto GameScene::stepDemo(float delta_time) -> bool {
fade_.update(delta_time); // fosa d'entrada des de negre
curtain_.update(delta_time); // cortinilla que destapa la demo
// Qualsevol input trenca la demo i torna al títol (música intacta).
if (Input::get()->checkAnyPlayerAction(DEMO_EXIT_ACTIONS)) {
@@ -714,9 +715,9 @@ void GameScene::draw() {
break;
}
// Fosa d'entrada de la demo: per damunt de tot. No-op fora del mode DEMO
// (fade_ mai s'arrenca) i quan ja ha acabat (alpha 0).
fade_.draw();
// Cortinilla d'entrada de la demo: per damunt de tot. No-op fora del mode
// DEMO (curtain_ mai s'arrenca) i quan ja ha sortit per baix.
curtain_.draw();
}
void GameScene::drawEnemies() const {