44 lines
1.8 KiB
C++
44 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "scenes/scene.hpp"
|
|
#include "scenes/surface_handle.hpp"
|
|
|
|
namespace scenes {
|
|
|
|
// Sub-escena de sprites de la intro (prota + momia + mapa + etc).
|
|
// Reemplaça `ModuleSequence::doIntroSprites()`. No es registra al
|
|
// SceneRegistry — es construeix com a membre de `IntroScene` o
|
|
// `IntroNewLogoScene` quan aquestes completen el seu revelat del logo.
|
|
// Rep el `SurfaceHandle` del gfx de la intro via move, de manera que
|
|
// quan acabe l'escena el surface es lliberarà automàticament.
|
|
//
|
|
// En entrar tria una de 3 variants (`rand() % 3`): "interrogant/momia",
|
|
// "creu/pedra" o "ball de carnaval". Cada variant té un nombre
|
|
// diferent de fases però comparteixen el mateix motor: un comptador
|
|
// `step` que s'incrementa cada 20 ms, amb una taula per variant que
|
|
// mapeja (rang d'i, renderer) a cada fase. Qualsevol tecla salta
|
|
// l'escena — el flag `skippable` per fase es manté com a mecanisme
|
|
// per si alguna fase futura ha de ser no interrompuda (al vell codi
|
|
// la fase "final" de la variant 0 no cridava wait_frame_or_skip, cosa
|
|
// molt probablement un oversight: ací es tracta com a skippable).
|
|
class IntroSpritesScene : public Scene {
|
|
public:
|
|
explicit IntroSpritesScene(SurfaceHandle&& gfx);
|
|
~IntroSpritesScene() override = default;
|
|
|
|
void onEnter() override;
|
|
void tick(int delta_ms) override;
|
|
bool done() const override { return done_; }
|
|
int nextState() const override { return 1; }
|
|
|
|
private:
|
|
SurfaceHandle gfx_;
|
|
int variant_{0}; // 0..2 — triada a onEnter() amb rand() % 3
|
|
int phase_{0}; // índex dins la variant actual
|
|
int phase_step_{0}; // passos consumits dins la fase actual
|
|
int step_acc_ms_{0}; // acumulador per emetre steps de 20 ms
|
|
bool done_{false};
|
|
};
|
|
|
|
} // namespace scenes
|