SDL 2无法打开控制器但识别到游戏手柄

3
我正在使用SDL 2作为平台层和OpenGL作为图形和渲染,在写一个C++程序。我已经制作出一个完整的工作原型,包括键盘和鼠标输入。现在,我正在尝试使用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));

有人遇到这个问题吗?我进行了一些初步的搜索,但似乎通常要么没有手柄,要么一切都被识别。

此外,连接控制器时SDL_CONTROLLERDEVICEADDED不会触发。

在启动程序之前,通过 USB 连接控制器。此外,这是新控制器之一,我不确定是否与新控制器配套映射。考虑到有两个不同的条目,我认为是这样的。 谢谢。

编辑:

我再次检查,PS4 控制器作为游戏手柄工作正常,但未被识别为控制器,这意味着映射不正确或不存在。这可能是因为我的控制器是双震动 4 的“版本 2”,我不确定是否添加了与 2.0.5 兼容的映射。嗯。


我猜这与SDL2和大多数游戏检查游戏手柄与操纵杆有关。我需要查看SDL代码才能确定。游戏手柄往往需要驱动程序可被xinput.dll检测到。我相当确定您需要安装特殊驱动程序,例如SCPToolkit。Terraria就是一个例子。您可以尝试使用DS3控制器的xinput包装器,而不是SDL2 API。 - ffhighwind
我认为这在Mac或一般情况下并不是这样工作的,因为SDL应该为您处理所有驱动程序的疯狂。控制器在其他应用程序中运行良好。此外,我需要使用SDL的系统以保持与我的输入系统的一致性。我正在遵循这个链接:https://davidgow.net/handmadepenguin/ch6.html - synchronizer
我对Mac一无所知。看源代码...在手柄文件夹中,mac甚至不是一个目录。不过我看到了iphoneos。我可以告诉你,如果开发人员没有支持它,SDL2就分不清摇杆和游戏手柄之间的区别。IphoneOS似乎只支持Steam和“GC”控制器。正如您链接中所示,这些是XBox和Steam控制器。 - ffhighwind
根据此链接:https://github.com/Homebrew/homebrew-core/blob/master/Formula/sdl2.rb,Mavericks不是可用的bottle,除非我误解了,并且某种方式Mavericks能够从这些bottled中安装。--或者它是否可以安装旧版本(2.0.7)。我刚刚购买了控制器,所以这是第二代。有可能2.0.5的游戏控制器映射档案不包括这些吗?如果您能检查一下就太好了。但我不知道如何缩小我的示例。我所做的就是创建窗口并检查游戏手柄是否为游戏手柄。 - synchronizer
实际上,Brew脚本在其他瓶装酒窖之上有“任何”选项,所以这可能仍然有效。我曾看到2.0.8与Mavericks一起使用。 - synchronizer
显示剩余5条评论
1个回答

1
控制器被识别为游戏手柄而非控制器,意味着我找到的所有可用映射(在2.0.5控制器映射格式中)都与控制器不对应。更新从SDL 2.0.5到2.0.8似乎也更新了可用的映射,现在控制器被识别为游戏控制器。
注意:通常在项目进行中升级工具是一个糟糕的想法,但在这种情况下是安全的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接