Я использую SDL_GameControllerAddMappingsFromFile в своей игре, и я добавил новый игровой контроллер в файл gamecontrollerdb.txt. Я использовал SDL2 Gamepad Tool для создания отображения и добавил его в файл gamecontrollerdb.txt. Если я установлю переменную окружения SDL_GAMECONTROLLERCONFIG, чтобы указать на сопоставление, то все будет работать. Однако сопоставление не работает, когда я удаляю переменную среды, даже если такое же сопоставление добавлено в файл.
Я использовал соответствующий инструмент check.py, как указано здесь: https://github.com/gabomdq/SDL_GameControllerDB
Инструменты говорят, что файл выглядит хорошо. Я использую последнюю официальную версию SDL2 (2.0.9) и работаю под Windows 10. Мой код кросс-платформенный, и я протестировал его под Raspian с тем же разочаровывающим результатом.
Windows распознает контроллер Bluetooth с правильным именем, и я не получаю сообщение об ошибке при загрузке файла (мне кажется, что при чтении файла проверка ошибок вообще не производится).
Я протестировал код с несколькими другими игровыми контроллерами, и они работают, как и ожидалось, в Windows / OSX и Linux.
if (SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt") == -1) {
std::cout << "Warning: Failed to load game controller mappings: " << SDL_GetError() << std::endl;
}
Код, который фактически использует контроллер, находится здесь:
https://github.com/drpatrik/combatris/blob/develop/combatris/src/combatris.cpp
Я ожидаю, что контроллер будет распознан, поскольку отображение, очевидно, работает и добавляется в файл.
Я выяснил, в чем проблема. Некоторые геймпады обрабатываются как джойстик, что означает, что вам нужно включить события геймпада и джойстика, а также прослушивать события вложения от обоих:
SDL_JoystickEventState(SDL_ENABLE);
SDL_GameControllerEventState(SDL_ENABLE);
так же как:
...
case SDL_JOYDEVICEADDED:
case SDL_CONTROLLERDEVICEADDED:
Других решений пока нет …