fix(game): HUD lives desde YAML, prompt P1 en single-P2, countdown 9..0 configurable
This commit is contained in:
1 parent
78e164fce4
commit
5e862ceadc
9 files changed
+66
-29
No files matched your search
+14
-6
@@ -69,9 +69,10 @@ namespace {
|
||||
|
||||
} // namespace
|
||||
|
||||
Hud::Hud(EventBus& bus, std::shared_ptr<Text> font)
|
||||
Hud::Hud(EventBus& bus, std::shared_ptr<Text> font, int initial_lives)
|
||||
: bus_(bus),
|
||||
font_(std::move(font)) {
|
||||
font_(std::move(font)),
|
||||
initial_lives_(initial_lives) {
|
||||
// Geometria fixa dels tres blocs. Sumen exactament GameCanvas::WIDTH.
|
||||
// La durada de l'animació d'entrada ve de data/config/ui.yaml via UiConfig.
|
||||
const int ENTRY_MS = UiConfig::get().hudEntryMs();
|
||||
@@ -103,10 +104,17 @@ Hud::Hud(EventBus& bus, std::shared_ptr<Text> font)
|
||||
.entry_offset_y = 0,
|
||||
};
|
||||
|
||||
// Per defecte, P1 actiu (sempre n'hi ha al menys un); P2 inactiu fins
|
||||
// que un segon Player s'uneix mitjançant `activatePlayer(2)`.
|
||||
players_[0].active = true;
|
||||
// Naixem amb tots dos slots inactius. El GameScene crida
|
||||
// `activatePlayer(...)` per als que arrenquen en partida segons
|
||||
// `starting_players` (un, l'altre, o tots dos). Els no activats
|
||||
// mostraran el prompt "POLSA START / PER JUGAR" via `setJoinPrompt`
|
||||
// fins que el jugador faci join. Les vides s'inicialitzen al valor
|
||||
// del YAML del jugador — sense això, canviar `lives:` no es
|
||||
// reflectiria al marcador.
|
||||
players_[0].active = false;
|
||||
players_[0].lives = initial_lives_;
|
||||
players_[1].active = false;
|
||||
players_[1].lives = initial_lives_;
|
||||
|
||||
// Subscripcions al bus de l'EntityManager. De moment només `player_hit`
|
||||
// afecta el HUD visualment: decrementa vides, dispara flash i shake al
|
||||
@@ -176,7 +184,7 @@ void Hud::activatePlayer(int player_one_based) {
|
||||
if (player_one_based < 1 || player_one_based > 2) { return; }
|
||||
auto& p = players_[static_cast<std::size_t>(player_one_based - 1)];
|
||||
p.active = true;
|
||||
p.lives = DEFAULT_LIVES;
|
||||
p.lives = initial_lives_;
|
||||
p.score = 0;
|
||||
p.treasures = 0;
|
||||
p.join_prompt = JoinPromptMode::NONE;
|
||||
|
||||
+10
-6
@@ -55,7 +55,11 @@ class Hud {
|
||||
CAN_JOIN,
|
||||
WAIT };
|
||||
|
||||
Hud(EventBus& bus, std::shared_ptr<Text> font);
|
||||
// `initial_lives` es la cantidad de vides amb què s'activa un slot
|
||||
// (P1 al ctor i, més tard, els que arriben via "join in progress").
|
||||
// Ve del YAML del jugador (`Player::death_config.initial_lives`),
|
||||
// així el marcador segueix automàticament la configuració del joc.
|
||||
Hud(EventBus& bus, std::shared_ptr<Text> font, int initial_lives);
|
||||
~Hud();
|
||||
|
||||
Hud(const Hud&) = delete;
|
||||
@@ -111,10 +115,6 @@ class Hud {
|
||||
static constexpr int LINE1_Y = 4;
|
||||
static constexpr int LINE2_Y = 13;
|
||||
|
||||
// Vides inicials per jugador (placeholder fins que GameScene ho
|
||||
// configure des del Config del nivell).
|
||||
static constexpr int DEFAULT_LIVES = 3;
|
||||
|
||||
struct Block {
|
||||
Mode mode{Mode::IDLE};
|
||||
// Coordenades de pantalla on viu el bloc (constants durant la
|
||||
@@ -143,7 +143,7 @@ class Hud {
|
||||
};
|
||||
|
||||
struct PlayerStats {
|
||||
int lives{DEFAULT_LIVES};
|
||||
int lives{0};
|
||||
int score{0};
|
||||
int treasures{0};
|
||||
// `false` → el bloc mostra el prompt actiu (`join_prompt`) o
|
||||
@@ -179,4 +179,8 @@ class Hud {
|
||||
std::array<PlayerStats, 2> players_;
|
||||
int pyramid_{1};
|
||||
int room_{1};
|
||||
// Vides amb què s'arrenca un slot (`activatePlayer`). Cachejat al
|
||||
// ctor des de `Player::death_config.initial_lives` per no llegir el
|
||||
// singleton estàtic en el camí calent del bus de events.
|
||||
int initial_lives_{0};
|
||||
};
|
||||
Reference in new issue
Block a user