SDL 2无法打开控制器,但可以识别操纵杆

时间:2018-06-27 22:23:39

标签: c++ macos input sdl sdl-2

我正在使用SDL 2编写C ++程序用于平台层,使用opengl编写图形和渲染。我有一个使用键盘和鼠标输入的完整工作原型。现在,我现在正在尝试使用SDL的游戏控制器API连接游戏手柄(以替换或补充键盘控件)。不幸的是,尽管该控制器可以与其他软件完美配合,但似乎仍未被认可。这是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连接。另外,这是新的控制器之一,我不确定映射是否与该新控制器一起使用。考虑到有两个不同的条目,我假设是这样。 谢谢。

编辑:

我仔细检查了一下,PS4控制器可以很好地用作游戏杆,但未被识别为控制器,这意味着映射不正确或不存在。这可能是因为我的控制器是Dualshock 4的“版本2”,并且我不确定是否添加了2.0.5兼容的映射。嗯

1 个答案:

答案 0 :(得分:0)

该控制器被识别为操纵杆,而不是控制器,这意味着我找不到的可用映射(以2.0.5控制器映射格式)与该控制器不对应。从SDL 2.0.5更新到2.0.8似乎还更新了可用的映射,现在该控制器被认为是游戏控制器。

注意:通常,在项目中期升级工具是一个糟糕的主意,但在这种情况下,这样做是安全的。