migrant input: corregit GamepadManager.swapPlayers()

This commit is contained in:
2025-08-04 12:42:55 +02:00
parent 450edbd8b0
commit 64ee4727ce
4 changed files with 38 additions and 34 deletions

View File

@@ -23,7 +23,7 @@ Window window; // Opciones de la ventana
Settings settings; // Opciones del juego
Video video; // Opciones de vídeo
Audio audio; // Opciones de audio
GamepadManager gamepads; // Opciones de mando para cada jugador
GamepadManager gamepad_manager; // Opciones de mando para cada jugador
Keyboard keyboard; // Opciones para el teclado
PendingChanges pending_changes; // Opciones que se aplican al cerrar
@@ -42,7 +42,7 @@ void init() {
Difficulty::init();
// Opciones de control
gamepads.init();
gamepad_manager.init();
setKeyboardToPlayer(Player::Id::PLAYER1);
// Opciones de cambios pendientes
@@ -67,7 +67,7 @@ auto loadFromFile() -> bool {
if (line.substr(0, 1) != "#") {
int pos = line.find("=");
if (!set(line.substr(0, pos), line.substr(pos + 1, line.length()))) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Unknown parameter: %s", line.substr(0, pos).c_str());
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Unknown parameter: %s", line.substr(0, pos).c_str());
}
}
}
@@ -75,7 +75,7 @@ auto loadFromFile() -> bool {
}
// 3. Llamamos al asignador inteligente.
gamepads.assignAndLinkGamepads();
gamepad_manager.assignAndLinkGamepads();
// 4. Si el fichero no existía, lo creamos ahora con la configuración por defecto.
if (!file.good()) {
@@ -148,7 +148,7 @@ auto saveToFile() -> bool {
// Opciones de mandos
file << "\n\n## CONTROLLERS\n";
gamepads.saveToFile(file);
gamepad_manager.saveToFile(file);
// Cierra el fichero
file.close();
@@ -169,7 +169,7 @@ void parseAndSetController(const std::string& var, const std::string& value) {
int controller_index = std::stoi(var.substr(first_dot + 1, second_dot - first_dot - 1));
std::string setting_key = var.substr(second_dot + 1);
gamepads.setControllerProperty(controller_index, setting_key, value);
gamepad_manager.setControllerProperty(controller_index, setting_key, value);
} catch (const std::exception&) {
// Error en parsing
}
@@ -252,7 +252,7 @@ void swapKeyboard() {
// Intercambia los jugadores asignados a los dos primeros mandos
void swapControllers() {
gamepads.swapPlayers();
gamepad_manager.swapPlayers();
}
// Averigua quien está usando el teclado
@@ -279,7 +279,7 @@ bool assignGamepadByName(const std::string& gamepad_name_to_find, Player::Id pla
auto found_gamepad = Input::get()->findAvailableGamepadByName(gamepad_name_to_find);
if (found_gamepad) {
return gamepads.assignGamepadToPlayer(player_id, found_gamepad, found_gamepad->name);
return gamepad_manager.assignGamepadToPlayer(player_id, found_gamepad, found_gamepad->name);
}
return false;
}
@@ -287,7 +287,7 @@ bool assignGamepadByName(const std::string& gamepad_name_to_find, Player::Id pla
// Obtener información de un gamepad específico
std::string getGamepadInfo(Player::Id player_id) {
try {
const auto& gamepad = gamepads.getGamepad(player_id);
const auto& gamepad = gamepad_manager.getGamepad(player_id);
return "Player " + std::to_string(static_cast<int>(player_id)) +
": " + (gamepad.name.empty() ? "No gamepad" : gamepad.name);
} catch (const std::exception&) {
@@ -303,10 +303,10 @@ void GamepadManager::assignAndLinkGamepads() {
// 2. Reiniciamos las asignaciones actuales y guardamos los nombres que teníamos en la config.
std::array<std::string, MAX_PLAYERS> desired_names;
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
desired_names[i] = gamepads[i].name; // Guardamos el nombre deseado
gamepads[i].instance = nullptr; // Limpiamos la instancia
desired_names[i] = gamepads[i].name; // Guardamos el nombre deseado
gamepads[i].instance = nullptr; // Limpiamos la instancia
}
// 3. Vector para rastrear los mandos físicos que ya hemos asignado.
std::vector<std::shared_ptr<Input::Gamepad>> assigned_instances;
@@ -315,7 +315,7 @@ void GamepadManager::assignAndLinkGamepads() {
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
const std::string& desired_name = desired_names[i];
if (desired_name.empty()) {
continue; // Si no se pide un nombre específico, pasamos a la siguiente fase.
continue; // Si no se pide un nombre específico, pasamos a la siguiente fase.
}
// Buscamos un mando físico que coincida con el nombre deseado.
@@ -331,9 +331,9 @@ void GamepadManager::assignAndLinkGamepads() {
}
if (!already_assigned) {
gamepads[i].instance = physical_gamepad; // Enlazamos la instancia
assigned_instances.push_back(physical_gamepad); // Lo marcamos como asignado
break; // Mando encontrado para este jugador, pasamos al siguiente.
gamepads[i].instance = physical_gamepad; // Enlazamos la instancia
assigned_instances.push_back(physical_gamepad); // Lo marcamos como asignado
break; // Mando encontrado para este jugador, pasamos al siguiente.
}
}
}
@@ -342,8 +342,8 @@ void GamepadManager::assignAndLinkGamepads() {
// --- SEGUNDA PASADA: Asignar los mandos restantes a los jugadores sin mando ---
// Recorremos de nuevo la configuración de nuestros jugadores.
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
if (gamepads[i].instance == nullptr) { // Si este jugador aún no tiene mando...
if (gamepads[i].instance == nullptr) { // Si este jugador aún no tiene mando...
// ...buscamos un mando físico que todavía esté libre.
for (const auto& physical_gamepad : physical_gamepads) {
bool already_assigned = false;
@@ -355,12 +355,12 @@ void GamepadManager::assignAndLinkGamepads() {
}
if (!already_assigned) {
gamepads[i].instance = physical_gamepad; // Se lo asignamos
gamepads[i].instance = physical_gamepad; // Se lo asignamos
// MUY IMPORTANTE: Actualizamos el nombre en la configuración.
// Si guardamos, ahora se guardará el nombre del mando real que se le asignó.
gamepads[i].name = physical_gamepad->name;
assigned_instances.push_back(physical_gamepad); // Lo marcamos como asignado
break; // Mando encontrado, pasamos al siguiente jugador.
assigned_instances.push_back(physical_gamepad); // Lo marcamos como asignado
break; // Mando encontrado, pasamos al siguiente jugador.
}
}
}