refactor(#28): Input rep Config::PlayerBindings per paràmetre

Pas 3/N del hallazgo #28.

Input deixa d'incloure game/options.hpp. Els antics applyPlayerXFromOptions
es renombren a applyPlayerXBindings(const Config::PlayerBindings&) i
reben els bindings per paràmetre en lloc de llegir-los del global
Options::*. El Director hi passa Options::player1/2 als call-sites.

Esborrats applyKeyboardBindingsFromOptions i applyGamepadBindingsFromOptions
que no eren cridats per ningú (dead code aprofitat).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 19:30:55 +02:00
parent 2f0b148380
commit d118218662
3 changed files with 144 additions and 175 deletions
+24 -54
View File
@@ -8,8 +8,6 @@
#include <unordered_map> // Para unordered_map, _Node_iterator, operator==, _Node_iterator_base, _Node_const_iterator #include <unordered_map> // Para unordered_map, _Node_iterator, operator==, _Node_iterator_base, _Node_const_iterator
#include <utility> // Para move #include <utility> // Para move
#include "game/options.hpp" // Para Options::controls
// Singleton // Singleton
Input* Input::instance = nullptr; Input* Input::instance = nullptr;
@@ -51,34 +49,6 @@ void Input::bindKey(Action action, SDL_Scancode code) {
keyboard_.bindings[action].scancode = code; keyboard_.bindings[action].scancode = code;
} }
// Aplica las teclas configuradas desde Options
void Input::applyKeyboardBindingsFromOptions() {
bindKey(Action::LEFT, Options::keyboard_controls.key_left);
bindKey(Action::RIGHT, Options::keyboard_controls.key_right);
bindKey(Action::THRUST, Options::keyboard_controls.key_thrust);
}
// Aplica configuración de botones del gamepad desde Options al primer gamepad conectado
void Input::applyGamepadBindingsFromOptions() {
// Si no hay gamepads conectados, no hay nada que hacer
if (gamepads_.empty()) {
return;
}
// Obtener el primer gamepad conectado
const auto& gamepad = gamepads_[0];
// Aplicar bindings desde Options
// Los valores pueden ser:
// - 0-20+: Botones SDL_GamepadButton (DPAD, face buttons, shoulders)
// - 100: L2 trigger
// - 101: R2 trigger
// - 200+: Ejes del stick analógico
gamepad->bindings[Action::LEFT].button = Options::gamepad_controls.button_left;
gamepad->bindings[Action::RIGHT].button = Options::gamepad_controls.button_right;
gamepad->bindings[Action::THRUST].button = Options::gamepad_controls.button_thrust;
}
// Asigna inputs a botones del mando // Asigna inputs a botones del mando
void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button) { void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button) {
if (gamepad != nullptr) { if (gamepad != nullptr) {
@@ -494,22 +464,22 @@ auto Input::findAvailableGamepadByName(const std::string& gamepad_name) -> std::
// ========== MÉTODOS ESPECÍFICOS POR JUGADOR (ORNI) ========== // ========== MÉTODOS ESPECÍFICOS POR JUGADOR (ORNI) ==========
// Aplica configuración de controles del player 1 // Aplica configuración de controles del player 1
void Input::applyPlayer1BindingsFromOptions() { void Input::applyPlayer1Bindings(const Config::PlayerBindings& bindings) {
// 1. Aplicar bindings de teclado (NO usar bindKey, llenar mapa específico) // 1. Aplicar bindings de teclado (NO usar bindKey, llenar mapa específico)
player1_keyboard_bindings_[Action::LEFT].scancode = Options::player1.keyboard.key_left; player1_keyboard_bindings_[Action::LEFT].scancode = bindings.keyboard.key_left;
player1_keyboard_bindings_[Action::RIGHT].scancode = Options::player1.keyboard.key_right; player1_keyboard_bindings_[Action::RIGHT].scancode = bindings.keyboard.key_right;
player1_keyboard_bindings_[Action::THRUST].scancode = Options::player1.keyboard.key_thrust; player1_keyboard_bindings_[Action::THRUST].scancode = bindings.keyboard.key_thrust;
player1_keyboard_bindings_[Action::SHOOT].scancode = Options::player1.keyboard.key_shoot; player1_keyboard_bindings_[Action::SHOOT].scancode = bindings.keyboard.key_shoot;
player1_keyboard_bindings_[Action::START].scancode = Options::player1.keyboard.key_start; player1_keyboard_bindings_[Action::START].scancode = bindings.keyboard.key_start;
// 2. Encontrar gamepad por nombre (o usar primer gamepad como fallback) // 2. Encontrar gamepad por nombre (o usar primer gamepad como fallback)
std::shared_ptr<Gamepad> gamepad = nullptr; std::shared_ptr<Gamepad> gamepad = nullptr;
if (Options::player1.gamepad_name.empty()) { if (bindings.gamepad_name.empty()) {
// Fallback: usar primer gamepad disponible // Fallback: usar primer gamepad disponible
gamepad = (!gamepads_.empty()) ? gamepads_[0] : nullptr; gamepad = (!gamepads_.empty()) ? gamepads_[0] : nullptr;
} else { } else {
// Buscar por nombre // Buscar por nombre
gamepad = findAvailableGamepadByName(Options::player1.gamepad_name); gamepad = findAvailableGamepadByName(bindings.gamepad_name);
} }
if (!gamepad) { if (!gamepad) {
@@ -518,32 +488,32 @@ void Input::applyPlayer1BindingsFromOptions() {
} }
// 3. Aplicar bindings de gamepad // 3. Aplicar bindings de gamepad
gamepad->bindings[Action::LEFT].button = Options::player1.gamepad.button_left; gamepad->bindings[Action::LEFT].button = bindings.gamepad.button_left;
gamepad->bindings[Action::RIGHT].button = Options::player1.gamepad.button_right; gamepad->bindings[Action::RIGHT].button = bindings.gamepad.button_right;
gamepad->bindings[Action::THRUST].button = Options::player1.gamepad.button_thrust; gamepad->bindings[Action::THRUST].button = bindings.gamepad.button_thrust;
gamepad->bindings[Action::SHOOT].button = Options::player1.gamepad.button_shoot; gamepad->bindings[Action::SHOOT].button = bindings.gamepad.button_shoot;
// 4. Cachear referencia // 4. Cachear referencia
player1_gamepad_ = gamepad; player1_gamepad_ = gamepad;
} }
// Aplica configuración de controles del player 2 // Aplica configuración de controles del player 2
void Input::applyPlayer2BindingsFromOptions() { void Input::applyPlayer2Bindings(const Config::PlayerBindings& bindings) {
// 1. Aplicar bindings de teclado (mapa específico de P2, no sobrescribe P1) // 1. Aplicar bindings de teclado (mapa específico de P2, no sobrescribe P1)
player2_keyboard_bindings_[Action::LEFT].scancode = Options::player2.keyboard.key_left; player2_keyboard_bindings_[Action::LEFT].scancode = bindings.keyboard.key_left;
player2_keyboard_bindings_[Action::RIGHT].scancode = Options::player2.keyboard.key_right; player2_keyboard_bindings_[Action::RIGHT].scancode = bindings.keyboard.key_right;
player2_keyboard_bindings_[Action::THRUST].scancode = Options::player2.keyboard.key_thrust; player2_keyboard_bindings_[Action::THRUST].scancode = bindings.keyboard.key_thrust;
player2_keyboard_bindings_[Action::SHOOT].scancode = Options::player2.keyboard.key_shoot; player2_keyboard_bindings_[Action::SHOOT].scancode = bindings.keyboard.key_shoot;
player2_keyboard_bindings_[Action::START].scancode = Options::player2.keyboard.key_start; player2_keyboard_bindings_[Action::START].scancode = bindings.keyboard.key_start;
// 2. Encontrar gamepad por nombre (o usar segundo gamepad como fallback) // 2. Encontrar gamepad por nombre (o usar segundo gamepad como fallback)
std::shared_ptr<Gamepad> gamepad = nullptr; std::shared_ptr<Gamepad> gamepad = nullptr;
if (Options::player2.gamepad_name.empty()) { if (bindings.gamepad_name.empty()) {
// Fallback: usar segundo gamepad disponible // Fallback: usar segundo gamepad disponible
gamepad = (gamepads_.size() > 1) ? gamepads_[1] : nullptr; gamepad = (gamepads_.size() > 1) ? gamepads_[1] : nullptr;
} else { } else {
// Buscar por nombre // Buscar por nombre
gamepad = findAvailableGamepadByName(Options::player2.gamepad_name); gamepad = findAvailableGamepadByName(bindings.gamepad_name);
} }
if (!gamepad) { if (!gamepad) {
@@ -552,10 +522,10 @@ void Input::applyPlayer2BindingsFromOptions() {
} }
// 3. Aplicar bindings de gamepad // 3. Aplicar bindings de gamepad
gamepad->bindings[Action::LEFT].button = Options::player2.gamepad.button_left; gamepad->bindings[Action::LEFT].button = bindings.gamepad.button_left;
gamepad->bindings[Action::RIGHT].button = Options::player2.gamepad.button_right; gamepad->bindings[Action::RIGHT].button = bindings.gamepad.button_right;
gamepad->bindings[Action::THRUST].button = Options::player2.gamepad.button_thrust; gamepad->bindings[Action::THRUST].button = bindings.gamepad.button_thrust;
gamepad->bindings[Action::SHOOT].button = Options::player2.gamepad.button_shoot; gamepad->bindings[Action::SHOOT].button = bindings.gamepad.button_shoot;
// 4. Cachear referencia // 4. Cachear referencia
player2_gamepad_ = gamepad; player2_gamepad_ = gamepad;
+3 -4
View File
@@ -9,6 +9,7 @@
#include <unordered_map> // Para unordered_map #include <unordered_map> // Para unordered_map
#include <vector> // Para vector #include <vector> // Para vector
#include "core/config/engine_config.hpp"
#include "core/input/input_types.hpp" // for InputAction #include "core/input/input_types.hpp" // for InputAction
// --- Clase Input: gestiona la entrada de teclado y mandos (singleton) --- // --- Clase Input: gestiona la entrada de teclado y mandos (singleton) ---
@@ -88,12 +89,10 @@ class Input {
// --- Configuración de controles --- // --- Configuración de controles ---
void bindKey(Action action, SDL_Scancode code); void bindKey(Action action, SDL_Scancode code);
void applyKeyboardBindingsFromOptions();
void applyGamepadBindingsFromOptions();
// Configuración por player (Orni - dos jugadores) // Configuración por player (Orni - dos jugadores)
void applyPlayer1BindingsFromOptions(); void applyPlayer1Bindings(const Config::PlayerBindings& bindings);
void applyPlayer2BindingsFromOptions(); void applyPlayer2Bindings(const Config::PlayerBindings& bindings);
static void bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button); static void bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button);
static void bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action_target, Action action_source); static void bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action_target, Action action_source);
+2 -2
View File
@@ -99,8 +99,8 @@ Director::Director(std::vector<std::string> const& args) {
Input::init("data/gamecontrollerdb.txt"); Input::init("data/gamecontrollerdb.txt");
// Aplicar configuración de controls dels jugadors // Aplicar configuración de controls dels jugadors
Input::get()->applyPlayer1BindingsFromOptions(); Input::get()->applyPlayer1Bindings(Options::player1);
Input::get()->applyPlayer2BindingsFromOptions(); Input::get()->applyPlayer2Bindings(Options::player2);
if (Options::console) { if (Options::console) {
std::cout << "Configuración carregada\n"; std::cout << "Configuración carregada\n";