tweak(hud): mode de vides commutable a Defaults (slots o dígits); per defecte dígits per veure'l
This commit is contained in:
@@ -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).
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user