From c4933875ddc7ca4e4951b40a822b4943612be516 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 24 May 2026 20:36:51 +0200 Subject: [PATCH] fix(input): impedeix que els events traspassin al joc en acabar el rebind El menu de servei queda obert per sota de l'overlay DefineInputs durant tot el rebind (en lloc de tancar-se al activar la accio), de manera que absorbeix qualsevol KEY_DOWN que arribi un cop l'overlay s'auto-cancela. La pantalla de titol tambe pausa la seua logica mentre el menu de servei esta obert, igual que GameScene, per evitar que detecti un START fantasma si l'usuari encara te una tecla pulsada al moment de tancar-se el modal. Co-Authored-By: Claude Opus 4.7 (1M context) --- source/core/system/service_menu.cpp | 22 +++++++++------------- source/core/system/service_menu.hpp | 2 +- source/game/scenes/title_scene.cpp | 8 ++++++++ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/source/core/system/service_menu.cpp b/source/core/system/service_menu.cpp index 2dc6f25..45c63f8 100644 --- a/source/core/system/service_menu.cpp +++ b/source/core/system/service_menu.cpp @@ -523,16 +523,16 @@ namespace System { }; } - auto makeDefineItem(const char* label_key, DefineInputs::Mode mode, DefineInputs::Player pl, ServiceMenu* menu) -> ServiceMenu::Item { + auto makeDefineItem(const char* label_key, DefineInputs::Mode mode, DefineInputs::Player pl) -> ServiceMenu::Item { return ServiceMenu::Item{ .kind = ServiceMenu::Kind::ACTION, .label_key = label_key, .label_text = {}, .selectable = true, - .on_activate = [mode, pl, menu] { - if (startDefine(mode, pl) && menu != nullptr && menu->isOpen()) { - menu->toggle(); - } }, + // El menu de servei NO es tanca: queda obert per sota de + // l'overlay i absorbira qualsevol event que arribi un cop + // l'overlay s'haja auto-cancel·lat. + .on_activate = [mode, pl] { startDefine(mode, pl); }, .get_value_text = {}, .on_change = {}, }; @@ -548,20 +548,16 @@ namespace System { makeCyclePadItem("service_menu.controls_pad_p2", 1), makeDefineItem("service_menu.controls_define_keyboard_p1", DefineInputs::Mode::KEYBOARD, - DefineInputs::Player::P1, - this), + DefineInputs::Player::P1), makeDefineItem("service_menu.controls_define_keyboard_p2", DefineInputs::Mode::KEYBOARD, - DefineInputs::Player::P2, - this), + DefineInputs::Player::P2), makeDefineItem("service_menu.controls_define_gamepad_p1", DefineInputs::Mode::GAMEPAD, - DefineInputs::Player::P1, - this), + DefineInputs::Player::P1), makeDefineItem("service_menu.controls_define_gamepad_p2", DefineInputs::Mode::GAMEPAD, - DefineInputs::Player::P2, - this), + DefineInputs::Player::P2), }; return page; } diff --git a/source/core/system/service_menu.hpp b/source/core/system/service_menu.hpp index c1c9fe9..0fa1538 100644 --- a/source/core/system/service_menu.hpp +++ b/source/core/system/service_menu.hpp @@ -98,7 +98,7 @@ namespace System { [[nodiscard]] static auto buildAudioPage() -> Page; [[nodiscard]] auto buildOptionsPage() const -> Page; [[nodiscard]] auto buildSystemPage() -> Page; - [[nodiscard]] auto buildControlsPage() -> Page; + [[nodiscard]] static auto buildControlsPage() -> Page; // Pagina de confirmacio "ESTAS SEGUR? NO/SI". on_yes s'executa si // l'usuari selecciona SI; el cursor per defecte apunta a NO. void pushConfirmPage(const std::string& title_key, std::function on_yes); diff --git a/source/game/scenes/title_scene.cpp b/source/game/scenes/title_scene.cpp index 6e57169..238c1bf 100644 --- a/source/game/scenes/title_scene.cpp +++ b/source/game/scenes/title_scene.cpp @@ -18,6 +18,7 @@ #include "core/math/easing.hpp" #include "core/rendering/shape_renderer.hpp" #include "core/system/scene_context.hpp" +#include "core/system/service_menu.hpp" #include "project.h" using SceneManager::SceneContext; @@ -294,6 +295,13 @@ auto TitleScene::isFinished() const -> bool { } void TitleScene::update(float delta_time) { + // Pausa global: mentre el menu de servei esta obert (i, per tant, el + // sub-overlay de rebind tambe, si esta actiu), congelem la logica de la + // pantalla de titol per no consumir un START fantasma quan l'overlay + // s'auto-tanca i les tecles encara s'estan pulsant. + if (const auto* menu = System::ServiceMenu::get(); menu != nullptr && menu->isOpen()) { + return; + } if (starfield_) { starfield_->update(delta_time); }