desacoplament de Player i Options

Player: canviat id de int a enum
migrant input: eliminat Device, keyboard separat de la llista de mandos, llig i guarda configuracions de mandos
falta: definir botons, asignar mandos a jugadors i guardar la asignació
This commit is contained in:
2025-08-03 22:49:28 +02:00
parent de9fb5aa4b
commit 90c080f3e3
19 changed files with 433 additions and 353 deletions

View File

@@ -19,13 +19,13 @@
namespace Options {
// --- Variables globales ---
WindowOptions window; // Opciones de la ventana
SettingsOptions settings; // Opciones del juego
VideoOptions video; // Opciones de vídeo
AudioOptions audio; // Opciones de audio
std::vector<GamepadOptions> controllers; // Opciones de mando para cada jugador
PendingChanges pending_changes; // Opciones que se aplican al cerrar
// std::vector<GamepadConfig> gamepad_configs; // Lista con las configuraciones registradas para cada mando
Window window; // Opciones de la ventana
Settings settings; // Opciones del juego
Video video; // Opciones de vídeo
Audio audio; // Opciones de audio
std::vector<std::shared_ptr<Gamepad>> gamepads; // Opciones de mando para cada jugador
Keyboard keyboard; // Opciones para el teclado
PendingChanges pending_changes; // Opciones que se aplican al cerrar
// Declaraciones
auto set(const std::string& var, const std::string& value) -> bool;
@@ -42,10 +42,10 @@ void init() {
Difficulty::init();
// Opciones de control
controllers.clear();
controllers.emplace_back(GamepadOptions(1));
controllers.emplace_back(GamepadOptions(2));
setKeyboardToPlayer(1);
gamepads.clear();
gamepads.emplace_back(std::make_shared<Gamepad>(Player::Id::PLAYER1));
gamepads.emplace_back(std::make_shared<Gamepad>(Player::Id::PLAYER2));
setKeyboardToPlayer(Player::Id::PLAYER1);
// Opciones de cambios pendientes
pending_changes.new_language = settings.language;
@@ -154,15 +154,15 @@ auto saveToFile() -> bool {
// Opciones de mandos
file << "\n\n## CONTROLLERS\n";
int controller_index = 0;
for (const auto& controller : controllers) {
file << "\n";
file << "controller." << controller_index << ".name=" << controller.name << "\n";
file << "controller." << controller_index << ".player=" << controller.player_id << "\n";
// Incrementa el índice
++controller_index;
}
// int controller_index = 0;
// for (const auto& controller : gamepads) {
// file << "\n";
// file << "controller." << controller_index << ".name=" << controller->name << "\n";
// file << "controller." << controller_index << ".player=" << controller->player_id << "\n";
//
// // Incrementa el índice
// ++controller_index;
// }
// Cierra el fichero
file.close();
@@ -173,19 +173,19 @@ auto saveToFile() -> bool {
// Función auxiliar para analizar la configuración del mando y reducir duplicación
void parseAndSetController(const std::string& var, const std::string& value) {
// Lógica básica de análisis (puede hacerse más robusta)
size_t first_dot = var.find('.');
size_t second_dot = var.find('.', first_dot + 1);
int controller_index = std::stoi(var.substr(first_dot + 1, second_dot - first_dot - 1));
std::string setting_key = var.substr(second_dot + 1);
auto& controller = controllers.at(controller_index);
if (setting_key == "name") {
controller.name = value;
} else if (setting_key == "player") {
controller.player_id = std::clamp(std::stoi(value), 1, 2);
}
// size_t first_dot = var.find('.');
// size_t second_dot = var.find('.', first_dot + 1);
//
// int controller_index = std::stoi(var.substr(first_dot + 1, second_dot - first_dot - 1));
// std::string setting_key = var.substr(second_dot + 1);
//
// auto& controller = gamepads.at(controller_index);
//
// if (setting_key == "name") {
// controller.name = value;
// } else if (setting_key == "player") {
// controller.player_id = std::clamp(std::stoi(value), 1, 2);
// }
}
auto set(const std::string& var, const std::string& value) -> bool {
@@ -254,35 +254,23 @@ auto set(const std::string& var, const std::string& value) -> bool {
}
// Asigna el teclado al jugador
void setKeyboardToPlayer(int player_id) {
for (auto& controller : controllers) {
if (controller.player_id == player_id) {
// controller.type = Input::Device::ANY;
} else {
// controller.type = Input::Device::CONTROLLER;
}
}
void setKeyboardToPlayer(Player::Id player_id) {
keyboard.player_id = player_id;
}
// Intercambia el teclado de jugador
void swapKeyboard() {
// std::swap(controllers.at(0).type, controllers.at(1).type);
keyboard.player_id = keyboard.player_id == Player::Id::PLAYER1 ? Player::Id::PLAYER2 : Player::Id::PLAYER1;
}
// Intercambia los jugadores asignados a los dos primeros mandos
void swapControllers() {
std::swap(controllers.at(0).player_id, controllers.at(1).player_id);
// std::swap(controllers.at(0).type, controllers.at(1).type);
std::swap(gamepads.at(0)->player_id, gamepads.at(1)->player_id);
}
// Averigua quien está usando el teclado
auto getPlayerWhoUsesKeyboard() -> int {
// for (const auto& controller : controllers) {
// if (controller.type == Input::Device::ANY) {
// return controller.player_id;
// }
//}
return 0;
auto getPlayerWhoUsesKeyboard() -> Player::Id {
return keyboard.player_id;
}
// Aplica los cambios pendientes copiando los valores a sus variables