feat(logo,menu): reiniciar des de servei → LOGO amb reset (atura música) i logo_jailgames.gif centrat
This commit is contained in:
1 parent
8eaa91f309
commit
f7ab6a641a
7 files changed
+92
-35
No files matched your search
@@ -5,26 +5,23 @@
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "core/audio/audio.hpp"
|
||||
#include "core/input/global_inputs.hpp"
|
||||
#include "core/rendering/notifier.hpp"
|
||||
#include "core/rendering/render_info.hpp"
|
||||
#include "core/rendering/screen.hpp"
|
||||
#include "core/rendering/text.hpp"
|
||||
#include "core/rendering/surface.hpp"
|
||||
#include "core/system/event_buffer.hpp"
|
||||
#include "core/ui/ui_config.hpp"
|
||||
#include "game/options.hpp"
|
||||
#include "game/scenes/placeholder_input.hpp"
|
||||
#include "game/scenes/scene_flow.hpp"
|
||||
#include "utils/defaults.hpp"
|
||||
#include "utils/defines.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr int NAME_Y_OFFSET = -8;
|
||||
constexpr int TIMER_Y_OFFSET = 8;
|
||||
// TODO: migrar a un logger unificat quan es decideixi (veure INC-03 a
|
||||
// docs/audit-core-rendering.md). De moment std::cout per rastrejar el
|
||||
// flux d'escenes als smoke runs.
|
||||
@@ -32,9 +29,19 @@ namespace {
|
||||
|
||||
} // namespace
|
||||
|
||||
LogoScene::LogoScene(std::shared_ptr<Text> font)
|
||||
: font_(std::move(font)) {
|
||||
std::cout << "[scene] " << SCENE_NAME << " start\n";
|
||||
LogoScene::LogoScene(std::shared_ptr<Surface> logo, bool reset)
|
||||
: logo_(std::move(logo)) {
|
||||
std::cout << "[scene] " << SCENE_NAME << (reset ? " start (reset)\n" : " start\n");
|
||||
// RESET = "Reiniciar" del menú: tornem al punt zero del joc, així que
|
||||
// qualsevol música o so en marxa (la del joc, els sons d'UI, etc.) ha
|
||||
// d'apagar-se abans que el LOGO comenci. En el flux normal no toquem
|
||||
// res — la música de TITLE pot seguir sonant durant l'attract-out.
|
||||
if (reset) {
|
||||
if (auto* audio = Audio::get(); audio != nullptr) {
|
||||
audio->stopMusic();
|
||||
audio->stopAllSounds();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LogoScene::~LogoScene() = default;
|
||||
@@ -64,20 +71,10 @@ void LogoScene::render() {
|
||||
constexpr std::uint32_t BLACK_ARGB = 0xFF000000U;
|
||||
Screen::get().fillRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, BLACK_ARGB);
|
||||
|
||||
if (font_) {
|
||||
const int SECS_LEFT = std::max(1, (timer_ms_ + 999) / 1000);
|
||||
font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG,
|
||||
GameCanvas::CENTER_X,
|
||||
GameCanvas::CENTER_Y + NAME_Y_OFFSET,
|
||||
SCENE_NAME,
|
||||
1,
|
||||
UiConfig::get().notificationText());
|
||||
font_->writeDX(Text::CENTER_FLAG | Text::COLOR_FLAG,
|
||||
GameCanvas::CENTER_X,
|
||||
GameCanvas::CENTER_Y + TIMER_Y_OFFSET,
|
||||
std::to_string(SECS_LEFT),
|
||||
1,
|
||||
UiConfig::get().notificationText());
|
||||
if (logo_) {
|
||||
const int X = (GameCanvas::WIDTH - logo_->getWidth()) / 2;
|
||||
const int Y = (GameCanvas::HEIGHT - logo_->getHeight()) / 2;
|
||||
logo_->render(X, Y);
|
||||
}
|
||||
|
||||
Notifier::get().render();
|
||||
|
||||
@@ -4,23 +4,29 @@
|
||||
|
||||
#include "core/scene/scene.hpp"
|
||||
|
||||
class Text;
|
||||
class Surface;
|
||||
|
||||
// Escena placeholder del logotip. Durada fixa (5 s) o skip amb qualsevol tecla
|
||||
// no reservada. Quan expira, publica un `ExitRequest` cap a TITLE; Director
|
||||
// és qui construeix la nova escena (l'escena no coneix els altres tipus i
|
||||
// es pot exercir en tests sense arrossegar dependències).
|
||||
// Escena del logotip de l'editora. Durada fixa (5 s) o skip amb qualsevol
|
||||
// tecla no reservada. Quan expira, publica un `ExitRequest` cap a TITLE;
|
||||
// Director és qui construeix la nova escena (l'escena no coneix els altres
|
||||
// tipus i es pot exercir en tests sense arrossegar dependències).
|
||||
//
|
||||
// Pinta el GIF `data/logo/logo_jailgames.gif` centrat dins del canvas
|
||||
// lògic, amb la seua paleta nadiua (no s'aplica la paleta UI). Si arriba
|
||||
// amb `reset=true` (acció "Reiniciar" del menú de servei), atura la
|
||||
// música i tots els sons al constructor — així el següent LOGO arrenca
|
||||
// silenciós encara que veníssem del joc en marxa.
|
||||
class LogoScene : public Scene {
|
||||
public:
|
||||
static constexpr int DURATION_MS = 5000;
|
||||
|
||||
explicit LogoScene(std::shared_ptr<Text> font);
|
||||
LogoScene(std::shared_ptr<Surface> logo, bool reset);
|
||||
~LogoScene() override;
|
||||
|
||||
void update(int delta_ms) override;
|
||||
void render() override;
|
||||
|
||||
private:
|
||||
std::shared_ptr<Text> font_;
|
||||
std::shared_ptr<Surface> logo_;
|
||||
int timer_ms_{DURATION_MS};
|
||||
};
|
||||
@@ -30,7 +30,15 @@ enum class SceneId : std::uint8_t {
|
||||
// rep cap dada de l'anterior; en cas contrari, només els camps que
|
||||
// fluixen pel canal de transició (els recursos, defaults i config
|
||||
// interna els resol Director quan construeix).
|
||||
struct LogoParams {};
|
||||
struct LogoParams {
|
||||
// Quan val `true`, indica que aquesta entrada al LOGO és una reinicialització
|
||||
// completa (acció "Reiniciar" del menú de servei): l'escena haurà d'aturar
|
||||
// música i sons abans de mostrar-se. En el flux normal LOGO→TITLE→… es
|
||||
// queda a `false` perquè qualsevol música prèvia (p. ex. la pista de
|
||||
// TITLE durant l'attract-out) continui sonant fins que la nova escena la
|
||||
// substituïsca.
|
||||
bool reset{false};
|
||||
};
|
||||
struct TitleParams {};
|
||||
struct IntroParams {
|
||||
DebugConfig::StartingPlayers starting_players{DebugConfig::StartingPlayers::BOTH};
|
||||
|
||||
Reference in new issue
Block a user