diff --git a/source/core/input/input.cpp b/source/core/input/input.cpp index 3685a8c..63a4cbb 100644 --- a/source/core/input/input.cpp +++ b/source/core/input/input.cpp @@ -188,6 +188,16 @@ auto Input::checkAnyButton(bool repeat) -> bool { return false; } +// Comprueba si algún jugador (P1 o P2) presionó alguna acción de una lista +auto Input::checkAnyPlayerAction(const std::span& actions, bool repeat) -> bool { + for (const auto& action : actions) { + if (checkActionPlayer1(action, repeat) || checkActionPlayer2(action, repeat)) { + return true; + } + } + return false; +} + // Comprueba si hay algun mando conectado auto Input::gameControllerFound() const -> bool { return !gamepads_.empty(); } diff --git a/source/core/input/input.hpp b/source/core/input/input.hpp index 20db2aa..726e033 100644 --- a/source/core/input/input.hpp +++ b/source/core/input/input.hpp @@ -4,6 +4,7 @@ #include // Para array #include // Para shared_ptr +#include // Para span #include // Para string, basic_string #include // Para unordered_map #include // Para pair @@ -108,6 +109,9 @@ class Input { auto checkActionPlayer1(Action action, bool repeat = true) -> bool; auto checkActionPlayer2(Action action, bool repeat = true) -> bool; + // Check if any player pressed any action from a list + auto checkAnyPlayerAction(const std::span& actions, bool repeat = DO_NOT_ALLOW_REPEAT) -> bool; + // --- Gestión de gamepads --- [[nodiscard]] auto gameControllerFound() const -> bool; [[nodiscard]] auto getNumGamepads() const -> int; diff --git a/source/core/input/input_types.hpp b/source/core/input/input_types.hpp index c07a7e4..4d958b0 100644 --- a/source/core/input/input_types.hpp +++ b/source/core/input/input_types.hpp @@ -2,6 +2,7 @@ #include +#include #include #include @@ -31,3 +32,11 @@ extern const std::unordered_map ACTION_TO_STRING; extern const std::unordered_map STRING_TO_ACTION; // Mapeo de string a acción extern const std::unordered_map BUTTON_TO_STRING; // Mapeo de botón a string extern const std::unordered_map STRING_TO_BUTTON; // Mapeo de string a botón + +// --- Constantes --- +// Physical arcade buttons (excludes directional controls LEFT/RIGHT) +static constexpr std::array ARCADE_BUTTONS = { + InputAction::SHOOT, + InputAction::THRUST, + InputAction::START +}; diff --git a/source/game/escenes/escena_logo.cpp b/source/game/escenes/escena_logo.cpp index 779a020..840be36 100644 --- a/source/game/escenes/escena_logo.cpp +++ b/source/game/escenes/escena_logo.cpp @@ -415,14 +415,7 @@ void EscenaLogo::dibuixar() { } auto EscenaLogo::checkSkipButtonPressed() -> bool { - auto* input = Input::get(); - for (auto action : SKIP_BUTTONS_LOGO) { - if (input->checkActionPlayer1(action, Input::DO_NOT_ALLOW_REPEAT) || - input->checkActionPlayer2(action, Input::DO_NOT_ALLOW_REPEAT)) { - return true; - } - } - return false; + return Input::get()->checkAnyPlayerAction(ARCADE_BUTTONS); } void EscenaLogo::processar_events(const SDL_Event& event) { diff --git a/source/game/escenes/escena_logo.hpp b/source/game/escenes/escena_logo.hpp index b125f85..49b19e0 100644 --- a/source/game/escenes/escena_logo.hpp +++ b/source/game/escenes/escena_logo.hpp @@ -18,11 +18,6 @@ #include "core/system/context_escenes.hpp" #include "core/types.hpp" -// Botones que permiten saltar la escena (extensible) -static constexpr std::array SKIP_BUTTONS_LOGO = { - InputAction::SHOOT -}; - class EscenaLogo { public: explicit EscenaLogo(SDLManager& sdl, GestorEscenes::ContextEscenes& context); diff --git a/source/game/escenes/escena_titol.cpp b/source/game/escenes/escena_titol.cpp index 33908c2..26e175e 100644 --- a/source/game/escenes/escena_titol.cpp +++ b/source/game/escenes/escena_titol.cpp @@ -585,16 +585,7 @@ void EscenaTitol::dibuixar() { } auto EscenaTitol::checkSkipButtonPressed() -> bool { - auto* input = Input::get(); - - for (auto action : SKIP_BUTTONS_TITOL) { - if (input->checkActionPlayer1(action, Input::DO_NOT_ALLOW_REPEAT) || - input->checkActionPlayer2(action, Input::DO_NOT_ALLOW_REPEAT)) { - return true; // Don't track players here, just skip - } - } - - return false; + return Input::get()->checkAnyPlayerAction(ARCADE_BUTTONS); } auto EscenaTitol::checkStartGameButtonPressed() -> bool { diff --git a/source/game/escenes/escena_titol.hpp b/source/game/escenes/escena_titol.hpp index ff53a3a..0dbcf23 100644 --- a/source/game/escenes/escena_titol.hpp +++ b/source/game/escenes/escena_titol.hpp @@ -20,13 +20,6 @@ #include "core/system/game_config.hpp" #include "core/types.hpp" -// Botones que permiten saltar/avanzar escenas ANTES de MAIN (extensible) -static constexpr std::array SKIP_BUTTONS_TITOL = { - InputAction::SHOOT, // FIRE - InputAction::THRUST, // THRUST - InputAction::START // START -}; - // Botones para INICIAR PARTIDA desde MAIN (solo START) static constexpr std::array START_GAME_BUTTONS = { InputAction::START