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:
+24
-54
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
Reference in New Issue
Block a user