fix Input: migrat correctament a SDL3 discoverGameControllers()

This commit is contained in:
2025-06-21 13:20:05 +02:00
parent 97f76e122d
commit 324ddd0416

View File

@@ -217,16 +217,20 @@ bool Input::discoverGameControllers()
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error: could not load %s file: %s", game_controller_db_path_.c_str(), SDL_GetError());
}
SDL_GetJoysticks(&num_joysticks_);
// En SDL3, SDL_GetJoysticks devuelve un array de IDs, no un contador
SDL_JoystickID* joystick_ids = SDL_GetJoysticks(&num_joysticks_);
num_gamepads_ = 0;
// Cuenta el número de mandos
joysticks_.clear();
for (int i = 0; i < num_joysticks_; ++i)
{
auto joy = SDL_OpenJoystick(i);
// Usar el ID del joystick, no el índice
auto joy = SDL_OpenJoystick(joystick_ids[i]);
joysticks_.push_back(joy);
if (SDL_IsGamepad(i))
// En SDL3, SDL_IsGamepad toma un SDL_JoystickID, no un índice
if (SDL_IsGamepad(joystick_ids[i]))
{
num_gamepads_++;
}
@@ -247,26 +251,40 @@ bool Input::discoverGameControllers()
{
found = true;
for (int i = 0; i < num_gamepads_; i++)
// Recorrer los joysticks y abrir solo los que son gamepads
for (int i = 0; i < num_joysticks_; i++)
{
// Abre el mando y lo añade a la lista
auto pad = SDL_OpenGamepad(i);
if (SDL_GamepadConnected(pad) == 1)
if (SDL_IsGamepad(joystick_ids[i]))
{
connected_controllers_.push_back(pad);
const std::string name = SDL_GetGamepadNameForID(i);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "#%d: %s", i, name.c_str());
controller_names_.push_back(name);
}
else
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_GetError() = %s", SDL_GetError());
// Abre el mando usando el ID del joystick
auto pad = SDL_OpenGamepad(joystick_ids[i]);
if (pad != nullptr)
{
connected_controllers_.push_back(pad);
// Obtener el nombre usando el ID del joystick
const char* name_cstr = SDL_GetGamepadNameForID(joystick_ids[i]);
std::string name = name_cstr ? name_cstr : "Unknown Gamepad";
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "#%d: %s", i, name.c_str());
controller_names_.push_back(name);
}
else
{
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to open gamepad %d: %s", joystick_ids[i], SDL_GetError());
}
}
}
SDL_SetGamepadEventsEnabled(true);
}
// Liberar el array de IDs
if (joystick_ids)
{
SDL_free(joystick_ids);
}
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "\n>> FINISHED LOOKING FOR GAME CONTROLLERS");
return found;
}