From 5710568af844f49e8e99d390520c3beb74e2bf5d Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 6 May 2026 08:23:01 +0200 Subject: [PATCH] =?UTF-8?q?feat(input):=20binding=20START=20per=20jugador?= =?UTF-8?q?=20(teclat=201/2=20fix,=20mando=20remapejable;=20pausa=20nom?= =?UTF-8?q?=C3=A9s=20per=20F11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/locale/ca.yaml | 1 + data/locale/en.yaml | 1 + source/core/input/define_buttons.cpp | 3 ++- source/core/input/gamepad_bindings.cpp | 3 +++ source/core/input/gamepad_bindings.hpp | 1 + source/game/entities/player.hpp | 2 ++ source/game/scenes/game_scene.cpp | 7 +++---- source/game/scenes/game_scene.hpp | 10 ++++++---- source/utils/defaults.hpp | 2 ++ 9 files changed, 21 insertions(+), 9 deletions(-) diff --git a/data/locale/ca.yaml b/data/locale/ca.yaml index a448e58..df96a87 100644 --- a/data/locale/ca.yaml +++ b/data/locale/ca.yaml @@ -76,6 +76,7 @@ menu: move_right: "Dreta" jump: "Saltar" attack: "Atacar" + start: "Start" service: "Opcions" gamepad_p1: "Comandament P1" gamepad_p2: "Comandament P2" diff --git a/data/locale/en.yaml b/data/locale/en.yaml index 5971339..41ef9dd 100644 --- a/data/locale/en.yaml +++ b/data/locale/en.yaml @@ -75,6 +75,7 @@ menu: move_right: "Right" jump: "Jump" attack: "Attack" + start: "Start" service: "Options" gamepad_p1: "Gamepad P1" gamepad_p2: "Gamepad P2" diff --git a/source/core/input/define_buttons.cpp b/source/core/input/define_buttons.cpp index 4914b0c..e00625a 100644 --- a/source/core/input/define_buttons.cpp +++ b/source/core/input/define_buttons.cpp @@ -62,7 +62,7 @@ void DefineButtons::disable() { } void DefineButtons::resetSequence() { - // Ordre: ATTACK, JUMP, SERVICE — replica l'estructura de + // Ordre: ATTACK, JUMP, START, SERVICE — replica l'estructura de // `clearButtons()` de coffee_crisis_arcade_edition (seqüència ordenada // d'accions amb la SERVICE al final) adaptada al joc actual. La label // de SERVICE va a una clau pròpia (`menu.items.service`) per no @@ -70,6 +70,7 @@ void DefineButtons::resetSequence() { sequence_.clear(); sequence_.push_back({"menu.items.attack", GamepadBindings::Action::ATTACK, static_cast(SDL_GAMEPAD_BUTTON_INVALID)}); sequence_.push_back({"menu.items.jump", GamepadBindings::Action::JUMP, static_cast(SDL_GAMEPAD_BUTTON_INVALID)}); + sequence_.push_back({"menu.items.start", GamepadBindings::Action::START, static_cast(SDL_GAMEPAD_BUTTON_INVALID)}); sequence_.push_back({"menu.items.service", GamepadBindings::Action::SERVICE, static_cast(SDL_GAMEPAD_BUTTON_INVALID)}); index_ = 0; } diff --git a/source/core/input/gamepad_bindings.cpp b/source/core/input/gamepad_bindings.cpp index 197be1e..b2c853d 100644 --- a/source/core/input/gamepad_bindings.cpp +++ b/source/core/input/gamepad_bindings.cpp @@ -24,6 +24,7 @@ namespace { ActionPair{GamepadBindings::Action::JUMP, std::string_view{"jump"}}, ActionPair{GamepadBindings::Action::ATTACK, std::string_view{"attack"}}, ActionPair{GamepadBindings::Action::SERVICE, std::string_view{"service"}}, + ActionPair{GamepadBindings::Action::START, std::string_view{"start"}}, }; using ButtonPair = std::pair; @@ -98,6 +99,8 @@ auto GamepadBindings::defaultButton(Action action) -> int { return static_cast(SDL_GAMEPAD_BUTTON_WEST); case Action::SERVICE: return static_cast(SDL_GAMEPAD_BUTTON_BACK); + case Action::START: + return static_cast(SDL_GAMEPAD_BUTTON_START); } return static_cast(SDL_GAMEPAD_BUTTON_INVALID); } diff --git a/source/core/input/gamepad_bindings.hpp b/source/core/input/gamepad_bindings.hpp index 3136266..eaffbe9 100644 --- a/source/core/input/gamepad_bindings.hpp +++ b/source/core/input/gamepad_bindings.hpp @@ -25,6 +25,7 @@ class GamepadBindings { JUMP, ATTACK, SERVICE, + START, }; // Triggers L2/R2 representats com a "botons virtuals" — replica la diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index db694fb..b60b451 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -27,6 +27,8 @@ class Player : public AnimatedSprite { SDL_Scancode right; SDL_Scancode jump; SDL_Scancode attack; + // No remapejable des del menú de servei: P1 → "1", P2 → "2". + SDL_Scancode start; }; // Estat d'alt nivell del jugador. Ortogonal a `Facing`/`Cardinal` diff --git a/source/game/scenes/game_scene.cpp b/source/game/scenes/game_scene.cpp index 07b4610..89861fa 100644 --- a/source/game/scenes/game_scene.cpp +++ b/source/game/scenes/game_scene.cpp @@ -14,7 +14,6 @@ #include #include "core/audio/audio.hpp" -#include "core/input/gamepad_manager.hpp" #include "core/input/global_inputs.hpp" #include "core/input/key_config.hpp" #include "core/locale/locale.hpp" @@ -348,6 +347,7 @@ GameScene::GameScene(Config config) .right = kb_p1.right, .jump = kb_p1.jump, .attack = kb_p1.attack, + .start = Defaults::KeysGame::START, }; const Player::Controls CONTROLS_P2{ .up = kb_p2.up, @@ -356,6 +356,7 @@ GameScene::GameScene(Config config) .right = kb_p2.right, .jump = kb_p2.jump, .attack = kb_p2.attack, + .start = Defaults::KeysGameP2::START, }; // Spawn lligat a la porta: tots els jugadors apareixen davant del // passadís de sortida. `computeSpawn` deriva les coordenades de @@ -1044,11 +1045,9 @@ void GameScene::handlePauseInput() { if (editor_.active()) { return; } #endif const SDL_Scancode PAUSE_SC = KeyConfig::get().scancode("pause"); - SDL_Gamepad* pad = GamepadManager::get().getPrimary(); for (const auto& event : EventBuffer::events) { const bool KEY_HIT = (event.type == SDL_EVENT_KEY_DOWN && PAUSE_SC != SDL_SCANCODE_UNKNOWN && event.key.scancode == PAUSE_SC); - const bool PAD_HIT = (event.type == SDL_EVENT_GAMEPAD_BUTTON_DOWN && pad != nullptr && event.gbutton.which == SDL_GetGamepadID(pad) && event.gbutton.button == SDL_GAMEPAD_BUTTON_START); - if (!KEY_HIT && !PAD_HIT) { continue; } + if (!KEY_HIT) { continue; } // Determinem cap a quin estat anem. Si estem quiets (IDLE o // PAUSED) arranquem la transició contrària. Si estem en marxa diff --git a/source/game/scenes/game_scene.hpp b/source/game/scenes/game_scene.hpp index 2adaf83..f20a493 100644 --- a/source/game/scenes/game_scene.hpp +++ b/source/game/scenes/game_scene.hpp @@ -58,10 +58,12 @@ class GameScene : public Scene { // crida `setState` (que reseteja la `Transition`). void updateRoomTransition(int delta_ms); - // Consumeix events d'aquest frame (F11 del KeyConfig "pause" o botó - // START del gamepad primari) per disparar les transicions de pausa. - // No alterna un flag binari: inicia (o inverteix mid-flight) un - // "dial" de temps que frena el món amb easing. + // Consumeix events d'aquest frame (F11 del KeyConfig "pause") per + // disparar les transicions de pausa. El mando ja no participa: el + // botó START és ara una acció remapeable per dispositiu i el menú + // de servei fa de pausa quan cal. No alterna un flag binari: inicia + // (o inverteix mid-flight) un "dial" de temps que frena el món amb + // easing. void handlePauseInput(); // Avança la transició activa, recalcula `pause_.scale` i aplica el diff --git a/source/utils/defaults.hpp b/source/utils/defaults.hpp index 1da9411..fe16da6 100644 --- a/source/utils/defaults.hpp +++ b/source/utils/defaults.hpp @@ -79,6 +79,7 @@ namespace Defaults { constexpr SDL_Scancode RIGHT = SDL_SCANCODE_RIGHT; constexpr SDL_Scancode JUMP = SDL_SCANCODE_M; constexpr SDL_Scancode ATTACK = SDL_SCANCODE_N; + constexpr SDL_Scancode START = SDL_SCANCODE_1; constexpr SDL_Scancode EXIT = SDL_SCANCODE_ESCAPE; } // namespace KeysGame @@ -93,6 +94,7 @@ namespace Defaults { constexpr SDL_Scancode RIGHT = SDL_SCANCODE_D; constexpr SDL_Scancode JUMP = SDL_SCANCODE_V; constexpr SDL_Scancode ATTACK = SDL_SCANCODE_C; + constexpr SDL_Scancode START = SDL_SCANCODE_2; } // namespace KeysGameP2 namespace Player {