Я пишу программу на C ++, используя SDL 2 для уровня платформы и opengl для графики и рендеринга. У меня есть полный рабочий прототип с клавиатурой и мышью. Сейчас я пытаюсь использовать API игрового контроллера SDL для подключения геймпада (для замены или дополнения элементов управления клавиатуры). К сожалению, контроллер, похоже, не распознается, несмотря на то, что он отлично работает с другими программами. Это Sony Dualshock 4 (для системы Playstation 4). Моя система - Mac OS 10.9.5, и я использую SDL 2.0.5 с официальной базой данных контроллера сообщества для SDL 2.0.5, которая содержит сопоставления контроллера ps4:
030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
4c05000000000000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X
Я также добавил новое отображение, используя один из официальных инструментов. Он также успешно загружается в соответствии с вызовом соответствующей функции.
Ниже приведен мой код, и он максимально приближен к минимальному примеру, который я могу получить:
// in main
// window and graphics context initialization here
// initialize SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) < 0) {
fprintf(stderr, "%s\n", "SDL could not initialize");
return EXIT_FAILURE;
}
// load controller mappings, I tested this and 35 mappings load successfully, which is expected
SDL_GameControllerAddMappingsFromFile("./mapping/gamecontrollerdb_205.txt");
// the controller handle
SDL_GameController* controller = nullptr;
// max_joysticks is 1, which means that the device connects at least
int max_joysticks = SDL_NumJoysticks();
if (max_joysticks < 1) {
return EXIT_FAILURE;
}
// this returns, which means that the joystick exists, but it isn't recognized as a game controller.
if (!SDL_IsGameController(0)) {
return EXIT_FAILURE;
}
// I never get passed this.
controller = SDL_GameControllerOpen(0);
fprintf(stdout, "CONTROLLER: %s\n", SDL_GameControllerName(controller));
Кто-нибудь сталкивался с этой проблемой? Как я уже упоминал, я провел предварительный поиск, но, похоже, либо число джойстиков равно 0, либо все распознается.
Кроме того, SDL_CONTROLLERDEVICEADDED
не срабатывает при подключении контроллера.
Контроллер подключен через USB до запуска программы. Кроме того, это один из новых контроллеров, и я не уверен, работают ли сопоставления с этим новым. Я так полагаю, учитывая, что есть две разные записи.
Спасибо.
EDIT:
Я дважды проверил, и контроллер PS4 прекрасно работает как джойстик, но он не распознается как контроллер, что означает, что отображение неверно или отсутствует. Это может быть связано с тем, что мой контроллер является «версией 2» для dualshock 4, и я не уверен, было ли добавлено сопоставление, совместимое с 2.0.5. Ммм