From 8d18c50aaad0c53b03037b314fa82b0e51a9f84f Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 29 May 2026 21:36:51 +0200 Subject: [PATCH] =?UTF-8?q?tweak(hud):=20mode=20de=20vides=20commutable=20?= =?UTF-8?q?a=20Defaults=20(slots=20o=20d=C3=ADgits);=20per=20defecte=20d?= =?UTF-8?q?=C3=ADgits=20per=20veure'l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/core/defaults/hud.hpp | 11 ++++++ source/game/systems/init_hud_animator.cpp | 48 ++++++++++++++++++++--- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/source/core/defaults/hud.hpp b/source/core/defaults/hud.hpp index a658910..78fbf71 100644 --- a/source/core/defaults/hud.hpp +++ b/source/core/defaults/hud.hpp @@ -5,6 +5,8 @@ #include +#include + namespace Defaults::Hud { // Marcador (scoreboard inferior). Usado por GameScene::drawScoreboard() @@ -12,6 +14,15 @@ namespace Defaults::Hud { constexpr float SCOREBOARD_TEXT_SCALE = 0.85F; constexpr float SCOREBOARD_TEXT_SPACING = 0.0F; + // Mode de presentació de les vides al marcador (no es canvia en calent; + // es defineix ací mentre no estiga decidit si el nombre de vides serà fix). + // SLOTS → naus en miniatura en posicions fixes (s'encenen/atenuen). + // DIGITS → número de 2 dígits (mateixa regla que el nivell: zeros a + // l'esquerra atenuats, dígit significatiu en endavant encès). + enum class LivesDisplay : std::uint8_t { SLOTS, + DIGITS }; + constexpr LivesDisplay LIVES_DISPLAY = LivesDisplay::DIGITS; + // Ajust fi de l'alçada dels slots de vides respecte a l'alçada del glif del // dígit: la silueta de la nau ompli menys que un dígit, així que un xicotet // factor >1 la fa casar visualment amb les xifres (calibrat a ull). diff --git a/source/game/systems/init_hud_animator.cpp b/source/game/systems/init_hud_animator.cpp index 4869c07..a1079a0 100644 --- a/source/game/systems/init_hud_animator.cpp +++ b/source/game/systems/init_hud_animator.cpp @@ -125,6 +125,20 @@ namespace Systems::InitHud { return (static_cast(NUM_SLOTS - 1) * digitPitch(scale, spacing)) + slotSize(scale); } + // Vides com a número de 2 dígits (zeros a l'esquerra). + auto livesDigits(int lives) -> std::string { + const std::string S = std::to_string(lives); + return (lives < 10) ? "0" + S : S; + } + + // Ample del bloc de vides segons el mode (constant en ambdós casos). + auto livesBlockWidth(float scale, float spacing) -> float { + if (Defaults::Hud::LIVES_DISPLAY == Defaults::Hud::LivesDisplay::DIGITS) { + return Graphics::VectorText::getTextWidth("00", scale, spacing); + } + return slotsBlockWidth(scale, spacing); + } + // Dibuixa els slots de vides com a naus en miniatura en posicions FIXES. // Slot amb vida disponible (repuesto) → color encès; slot buit → atenuat. // Repuestos = vides − 1 (la nau en joc no compta com a slot). @@ -197,16 +211,38 @@ namespace Systems::InitHud { return digitPitch(scale, spacing); } - // Ample (constant) del bloc d'un jugador: 6 dígits + separació + slots. + // Ample (constant) del bloc d'un jugador: 6 dígits + separació + vides. // No depèn de les vides, així res es recol·loca quan se'n perden. auto playerBlockWidth(float scale, float spacing) -> float { return Graphics::VectorText::getTextWidth("000000", scale, spacing) + - blockInnerGap(scale, spacing) + slotsBlockWidth(scale, spacing); + blockInnerGap(scale, spacing) + livesBlockWidth(scale, spacing); + } + + // Pinta el bloc de vides segons el mode: slots de nau o número de 2 dígits. + void drawLivesBlock(Rendering::Renderer* renderer, + const Graphics::VectorText& text, + const std::shared_ptr& shape, + int lives, + bool active, + SDL_Color bright, + SDL_Color dim, + float x_left, + float top_y, + float center_y, + float scale, + float spacing) { + if (Defaults::Hud::LIVES_DISPLAY == Defaults::Hud::LivesDisplay::DIGITS) { + // Mateixa regla que el nivell: zeros a l'esquerra atenuats. + drawScore(text, livesDigits(lives), bright, dim, active, x_left, top_y, scale, spacing); + return; + } + drawSlots(renderer, shape, lives, bright, dim, x_left, center_y, scale, spacing); } // Pinta el bloc d'un jugador "punts vides" amb el seu color (punts amb - // zeros atenuats, vides com a slots de nau). Ancorat a x_left (vora - // esquerra del bloc), mateix ordre per a P1 i P2 (no mirrored). + // zeros atenuats, vides com a slots de nau o número segons el mode). + // Ancorat a x_left (vora esquerra del bloc), mateix ordre per a P1 i P2 + // (no mirrored). void drawPlayerBlock(Rendering::Renderer* renderer, const Graphics::VectorText& text, const std::shared_ptr& shape, @@ -220,14 +256,14 @@ namespace Systems::InitHud { float scale, float spacing) { // Jugador inactiu → bloc apagat: es dibuixa igual però tot atenuat - // (punts i slots), com un display físic sense encendre. + // (punts i vides), com un display físic sense encendre. const float TOP_Y = center_y - (Graphics::VectorText::getTextHeight(scale) / 2.0F); const float W_SCORE = Graphics::VectorText::getTextWidth(score, scale, spacing); float x = x_left; drawScore(text, score, bright, dim, active, x, TOP_Y, scale, spacing); x += W_SCORE + blockInnerGap(scale, spacing); - drawSlots(renderer, shape, lives, bright, dim, x, center_y, scale, spacing); + drawLivesBlock(renderer, text, shape, lives, active, bright, dim, x, TOP_Y, center_y, scale, spacing); } // Pinta el nivell centrat: etiqueta "NIVELL" encesa i el número com els