feat(hud): marcador de la franja superior amb 3 blocs i animació d'entrada

This commit is contained in:
JailDesigner committed 2026-04-23 23:46:41 +02:00
1 parent 67ecb704d2
commit 82b229222f
6 files changed
+474 -1

No files matched your search

+21
View File
@@ -29,6 +29,7 @@
#include "game/entities/player.hpp"
#include "game/map/map.hpp"
#include "game/options.hpp"
#include "game/ui/hud.hpp"
#include "game/ui/ui_palette.hpp"
#include "utils/defaults.hpp"
#include "utils/defines.hpp"
@@ -139,6 +140,16 @@ GameScene::GameScene(Config config)
// sarcòfags passa per `tile_painted`.
players_.back()->setEventBus(&entity_manager_.getBus());
// Marcador (HUD) de la franja superior. Reutilitza la font 8bithud i
// la paleta "ui" ja precarregades pel Director — no toca disc des
// d'aquí. Subscrit al bus per reaccionar a `player_hit`,
// `level_complete`, etc. amb shake/flash i futurs canvis de mode.
const std::string HUD_FONT_GIF_KEY = std::string(Defaults::UI::Font::HUD_NAME) + ".gif";
auto hud_font_surface = Resource::Cache::get().getSurface(HUD_FONT_GIF_KEY);
auto hud_font = std::make_shared<Text>(hud_font_surface, Defaults::UI::Font::HUD_FNT);
hud_font->setDefaultKerning(Defaults::UI::Font::HUD_KERNING);
hud_ = std::make_unique<Hud>(entity_manager_.getBus(), hud_font, Resource::Cache::get().getPalette("ui"));
// Música de fons en bucle infinit. El track ja està al Resource::Cache
// (preload al Director), així que playMusic només mou el punter cap a
// jail_audio i obri l'stream. Audio::get() està garantit no-null:
@@ -236,6 +247,11 @@ void GameScene::update(int delta_ms) {
editor_.update(delta_ms, tilemap_);
#endif
// El HUD continua avançant les seues animacions encara que el món
// estigui congelat (pausa o editor): així l'animació d'entrada acaba
// sola i quan es despausa ja està al seu lloc, igual que el Notifier.
if (hud_) { hud_->update(delta_ms); }
RenderInfo::get().update(delta_ms, Options::buildRenderInfoFrame(UiColor::RENDER_INFO_TEXT, UiColor::RENDER_INFO_SHADOW));
Notifier::get().update(delta_ms);
}
@@ -291,6 +307,11 @@ void GameScene::render() {
r.player->render();
}
}
// HUD: a sobre dels actors perquè la franja superior tape qualsevol
// sprite que (durant l'animació d'entrada) puga sortir més amunt
// del playfield. S'amaga en mode editor (l'editor edita el tilemap;
// el HUD distrauria) però segueix actualitzant-se per fora.
if (hud_) { hud_->render(); }
}
#ifdef _DEBUG
+9
View File
@@ -13,6 +13,7 @@
#include "game/editor/editor.hpp"
#endif
class Hud;
class Player;
class Text;
@@ -63,6 +64,14 @@ class GameScene : public Scene {
// dos membres per garantir l'ordre invers a la destrucció.
std::unique_ptr<PaintLayer> paint_layer_;
// Marcador de la franja superior (24 px). `unique_ptr` per controlar
// l'ordre de construcció/destrucció igual que `paint_layer_`: es crea
// al ctor un cop `entity_manager_` ja té el bus, i es destrueix abans
// que `entity_manager_` (on viu el bus al qual està subscrit).
// Declarat després d'`entity_manager_` per garantir l'ordre invers a
// la destrucció.
std::unique_ptr<Hud> hud_;
// Pausa de gameplay. Quan `paused_` és true, l'update de jugadors i
// entitats es salta (el món es congela); l'input d'UI (GlobalInputs,
// Notifier, RenderInfo) continua per no perdre hotkeys ni l'overlay de