tweak(hud): marcador en tres blocs ancorats (P1 esquerra, P2 dreta, nivell centrat) amb color per jugador

This commit is contained in:
2026-05-29 20:09:28 +02:00
parent e4f8f586d6
commit 317e2a3fd9
5 changed files with 104 additions and 88 deletions
+19 -31
View File
@@ -814,7 +814,7 @@ void GameScene::drawInitHudState() {
}
if (score_progress > 0.0F) {
Systems::InitHud::drawScoreboardAnimated(text_, buildScoreboardSegments(), score_progress);
Systems::InitHud::drawScoreboardAnimated(text_, buildScoreboardData(), score_progress);
}
if (ship1_progress > 0.0F && match_config_.player1_active && ships_[0].isActive()) {
@@ -933,41 +933,29 @@ void GameScene::drawScoreboard() {
text_.renderCentered(Locale::get().text("demo.banner"), CENTER, SCALE, SPACING);
return;
}
Systems::InitHud::drawScoreboardSegmentsAt(text_, buildScoreboardSegments(), CENTER, SCALE, SPACING);
Systems::InitHud::drawScoreboardAt(text_, buildScoreboardData(), CENTER.y, SCALE, SPACING);
}
auto GameScene::buildScoreboardSegments() const -> Systems::InitHud::ScoreboardSegments {
Systems::InitHud::ScoreboardSegments out;
auto GameScene::buildScoreboardData() const -> Systems::InitHud::ScoreboardData {
Systems::InitHud::ScoreboardData out;
// Puntuació P1 (6 dígits) - zeros si inactiu
if (match_config_.player1_active) {
std::string s = std::to_string(score_per_player_[0]);
out.score_p1 = std::string(6 - std::min(6, static_cast<int>(s.length())), '0') + s;
out.lives_p1 = (lives_per_player_[0] < 10)
? "0" + std::to_string(lives_per_player_[0])
: std::to_string(lives_per_player_[0]);
} else {
out.score_p1 = "000000";
out.lives_p1 = "00";
}
// Puntuació a 6 dígits amb zeros a l'esquerra (inactiu → tot zeros, 0 vides).
const auto FORMAT_SCORE = [](int score) {
const std::string S = std::to_string(score);
return std::string(6 - std::min(6, static_cast<int>(S.length())), '0') + S;
};
// Nivell (2 dígits) amb label localitzat
out.score_p1 = match_config_.player1_active ? FORMAT_SCORE(score_per_player_[0]) : "000000";
out.lives_p1 = match_config_.player1_active ? lives_per_player_[0] : 0;
out.score_p2 = match_config_.player2_active ? FORMAT_SCORE(score_per_player_[1]) : "000000";
out.lives_p2 = match_config_.player2_active ? lives_per_player_[1] : 0;
// Nivell: etiqueta localitzada + número a 2 dígits (separats per pintar-los
// amb tonalitats distintes).
const uint8_t STAGE_NUM = stage_manager_->getCurrentStage();
const std::string STAGE_STR = (STAGE_NUM < 10) ? "0" + std::to_string(STAGE_NUM)
: std::to_string(STAGE_NUM);
out.level = Locale::get().text("hud.level") + STAGE_STR;
// Puntuació P2 (6 dígits) - zeros si inactiu
if (match_config_.player2_active) {
std::string s = std::to_string(score_per_player_[1]);
out.score_p2 = std::string(6 - std::min(6, static_cast<int>(s.length())), '0') + s;
out.lives_p2 = (lives_per_player_[1] < 10)
? "0" + std::to_string(lives_per_player_[1])
: std::to_string(lives_per_player_[1]);
} else {
out.score_p2 = "000000";
out.lives_p2 = "00";
}
out.level_label = Locale::get().text("hud.level");
out.level_value = (STAGE_NUM < 10) ? "0" + std::to_string(STAGE_NUM)
: std::to_string(STAGE_NUM);
return out;
}
+3 -3
View File
@@ -140,9 +140,9 @@ class GameScene final : public Scene {
void drawPlayingState();
void drawLevelCompletedState();
// [NEW] Helper del marcador: construeix els 5 segments (score_p1, vides_p1,
// level, score_p2, vides_p2) per a render colorit per segment.
[[nodiscard]] auto buildScoreboardSegments() const -> Systems::InitHud::ScoreboardSegments;
// Helper del marcador: construeix les dades (puntuacions, vides i nivell)
// per al render en blocs ancorats per jugador.
[[nodiscard]] auto buildScoreboardData() const -> Systems::InitHud::ScoreboardData;
// Sub-pasos de update() (descompuestos en Fase 9d para reducir
// complejidad cognitiva; cada uno es responsable de una sección).