fix(servicemenu): el menu flota i no pausa la demo ni congela el contador del títol
This commit is contained in:
@@ -269,10 +269,16 @@ void GameScene::handleEvent(const SDL_Event& event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GameScene::update(float delta_time) {
|
void GameScene::update(float delta_time) {
|
||||||
// Pausa global: mentre el menu de servei esta obert, congelem la lògica
|
// El menu de servei "flota" sobre l'escena: l'input se'n va cap a ell, mai
|
||||||
// de joc. El draw() segueix executant-se per a mantenir l'escena visible
|
// "a baix". En partida normal pausem la lògica de joc mentre està obert (el
|
||||||
// sota el menu.
|
// draw() segueix executant-se per a mantindre l'escena visible sota el menu).
|
||||||
if (const auto* menu = System::ServiceMenu::get(); menu != nullptr && menu->isOpen()) {
|
// En DEMO (attract) NO pausem: la demo ha de seguir viva sota el menu; només
|
||||||
|
// evitem que l'input la trenque (flag MENU_OPEN cap a stepDemo). Amb l'overlay
|
||||||
|
// de redefinir controls actiu el menu segueix "open", així que aquest únic
|
||||||
|
// check ja cobreix tots dos casos.
|
||||||
|
const auto* menu = System::ServiceMenu::get();
|
||||||
|
const bool MENU_OPEN = (menu != nullptr) && menu->isOpen();
|
||||||
|
if (MENU_OPEN && match_config_.mode != GameConfig::Mode::DEMO) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,7 +288,7 @@ void GameScene::update(float delta_time) {
|
|||||||
|
|
||||||
if (match_config_.mode == GameConfig::Mode::DEMO) {
|
if (match_config_.mode == GameConfig::Mode::DEMO) {
|
||||||
// Mode demo (attract): salida por input/timeout/muerte + control del pilot.
|
// Mode demo (attract): salida por input/timeout/muerte + control del pilot.
|
||||||
if (stepDemo(delta_time)) {
|
if (stepDemo(delta_time, MENU_OPEN)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (game_over_state_ == GameOverState::NONE) {
|
} else if (game_over_state_ == GameOverState::NONE) {
|
||||||
@@ -376,11 +382,13 @@ void GameScene::updateShipsControl(float delta_time) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto GameScene::stepDemo(float delta_time) -> bool {
|
auto GameScene::stepDemo(float delta_time, bool input_blocked) -> bool {
|
||||||
curtain_.update(delta_time); // cortinilla que destapa la demo
|
curtain_.update(delta_time); // cortinilla que destapa la demo
|
||||||
|
|
||||||
// Qualsevol input trenca la demo i torna al títol (música intacta).
|
// Qualsevol input trenca la demo i torna al títol (música intacta), pero NO
|
||||||
if (Input::get()->checkAnyPlayerAction(DEMO_EXIT_ACTIONS)) {
|
// mentre el menu de servei estiga obert: en eixe cas l'input va al menu i no
|
||||||
|
// arriba "a baix", així que la demo ha de seguir corrent sota seu.
|
||||||
|
if (!input_blocked && Input::get()->checkAnyPlayerAction(DEMO_EXIT_ACTIONS)) {
|
||||||
context_.setNextScene(SceneType::TITLE, Option::JUMP_TO_TITLE_MAIN);
|
context_.setNextScene(SceneType::TITLE, Option::JUMP_TO_TITLE_MAIN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -153,7 +153,9 @@ class GameScene final : public Scene {
|
|||||||
void updateShipsControl(float delta_time);
|
void updateShipsControl(float delta_time);
|
||||||
// Mode DEMO: gestiona salida (input→título, timeout/muerte→logo) y calcula
|
// Mode DEMO: gestiona salida (input→título, timeout/muerte→logo) y calcula
|
||||||
// el control + disparo del pilot. Devuelve true si la escena transiciona.
|
// el control + disparo del pilot. Devuelve true si la escena transiciona.
|
||||||
[[nodiscard]] auto stepDemo(float delta_time) -> bool;
|
// input_blocked: si un overlay (menu de servei / redefinir controls) està
|
||||||
|
// capturant l'input, no es deixa que l'input trenque la demo (segueix viva).
|
||||||
|
[[nodiscard]] auto stepDemo(float delta_time, bool input_blocked) -> bool;
|
||||||
void endDemo();
|
void endDemo();
|
||||||
// Devuelven true si el frame debe salir tras esta sección.
|
// Devuelven true si el frame debe salir tras esta sección.
|
||||||
[[nodiscard]] auto stepContinueScreen(float delta_time) -> bool;
|
[[nodiscard]] auto stepContinueScreen(float delta_time) -> bool;
|
||||||
|
|||||||
@@ -358,11 +358,16 @@ void TitleScene::update(float delta_time) {
|
|||||||
handleStartInput();
|
handleStartInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attract mode: al state MAIN, acumular inactivitat; qualsevol botó
|
// Attract mode: al state MAIN, acumular inactivitat; qualsevol botó arcade
|
||||||
// arcade la reseteja. En esgotar el timeout, saltar a la demo (mode DEMO,
|
// la reseteja. En esgotar el timeout, saltar a la demo (mode DEMO, P1 actiu)
|
||||||
// P1 actiu) sense fer fadeOut de la música (a diferència del START real).
|
// sense fer fadeOut de la música (a diferència del START real). El comptador
|
||||||
if (current_state_ == TitleState::MAIN && !INPUT_BLOCKED) {
|
// segueix corrent encara que el menu de servei o l'overlay de redefinir
|
||||||
if (Input::get()->checkAnyPlayerAction(ARCADE_BUTTONS, Input::ALLOW_REPEAT)) {
|
// controls estiguen oberts: floten sobre el títol i no aturen el fons, així
|
||||||
|
// que la demo arrenca igualment i les escenes poden canviar amb el menu
|
||||||
|
// obert. L'input, però, no arriba "a baix": només resetegem el comptador amb
|
||||||
|
// un botó arcade quan cap overlay l'està capturant.
|
||||||
|
if (current_state_ == TitleState::MAIN) {
|
||||||
|
if (!INPUT_BLOCKED && Input::get()->checkAnyPlayerAction(ARCADE_BUTTONS, Input::ALLOW_REPEAT)) {
|
||||||
idle_timer_ = 0.0F;
|
idle_timer_ = 0.0F;
|
||||||
} else {
|
} else {
|
||||||
idle_timer_ += delta_time;
|
idle_timer_ += delta_time;
|
||||||
|
|||||||
Reference in New Issue
Block a user