tweak(hud): mode de vides commutable a Defaults (slots o dígits); per defecte dígits per veure'l

This commit is contained in:
2026-05-29 21:36:51 +02:00
parent b412435862
commit 8d18c50aaa
2 changed files with 53 additions and 6 deletions
+11
View File
@@ -5,6 +5,8 @@
#include <SDL3/SDL.h>
#include <cstdint>
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).
+42 -6
View File
@@ -125,6 +125,20 @@ namespace Systems::InitHud {
return (static_cast<float>(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<Graphics::Shape>& 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<Graphics::Shape>& 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