SDL 2 не может открыть контроллер, но джойстик распознан - PullRequest
0 голосов
/ 28 июня 2018

Я пишу программу на 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. Ммм

1 Ответ

0 голосов
/ 28 июня 2018

Контроллер был распознан как джойстик, но не как контроллер, что означает, что ни одно из доступных отображений, которые я смог найти (в формате отображения контроллера 2.0.5), не соответствовало контроллеру. Обновление с SDL 2.0.5 до 2.0.8 также обновило доступные отображения, и теперь контроллер распознается как игровой контроллер.

Примечание: обычно это ужасная идея, чтобы обновить инструменты в середине проекта, но в этом случае это было безопасно сделать.

...