feat(title): FSM IDLE/STARTING amb START per jugador i propagació de StartingPlayers
This commit is contained in:
1 parent
1fc3ab8e31
commit
ca64115bfe
9 files changed
+143
-26
No files matched your search
@@ -1,11 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
#include "core/rendering/effects/heat_haze.hpp"
|
||||
#include "core/scene/scene.hpp"
|
||||
#include "game/debug_config.hpp"
|
||||
|
||||
class Surface;
|
||||
class Text;
|
||||
@@ -16,7 +18,17 @@ class Text;
|
||||
// data/ui.yaml secció `title:` per poder afinar-la sense recompilar.
|
||||
class TitleScene : public Scene {
|
||||
public:
|
||||
using SceneFactory = std::function<std::unique_ptr<Scene>()>;
|
||||
using SceneFactory = std::function<std::unique_ptr<Scene>(DebugConfig::StartingPlayers)>;
|
||||
|
||||
// Fases de l'escena.
|
||||
// - IDLE: animació atràctil. Cap tecla salta; només P1 START o
|
||||
// P2 START fan transició. El timeout (`title.duration_ms`)
|
||||
// salta a la següent escena amb BOTH (modus attract).
|
||||
// - STARTING: comptador fix entre la primera pulsació de START i
|
||||
// la transició. Si l'altre jugador prem START dins d'aquesta
|
||||
// finestra, el comptador es reseteja amb `pending_players_=BOTH`.
|
||||
enum class Phase : std::uint8_t { IDLE,
|
||||
STARTING };
|
||||
|
||||
TitleScene(std::shared_ptr<Text> display_font, std::shared_ptr<Text> condensed_font, std::shared_ptr<Surface> background, std::shared_ptr<Surface> mini_logo, SceneFactory next_factory);
|
||||
~TitleScene() override;
|
||||
@@ -25,6 +37,9 @@ class TitleScene : public Scene {
|
||||
void render() override;
|
||||
|
||||
private:
|
||||
void enterStarting(DebugConfig::StartingPlayers players);
|
||||
void advanceTo(DebugConfig::StartingPlayers players);
|
||||
|
||||
std::shared_ptr<Text> display_font_;
|
||||
std::shared_ptr<Text> condensed_font_;
|
||||
std::shared_ptr<Surface> background_;
|
||||
@@ -33,4 +48,7 @@ class TitleScene : public Scene {
|
||||
int timer_ms_;
|
||||
int blink_elapsed_ms_{0};
|
||||
std::optional<Effects::HeatHaze> heat_haze_;
|
||||
Phase phase_{Phase::IDLE};
|
||||
int starting_timer_ms_{0};
|
||||
DebugConfig::StartingPlayers pending_players_{DebugConfig::StartingPlayers::BOTH};
|
||||
};
|
||||
Reference in new issue
Block a user