【发布时间】:2018-12-06 21:47:48
【问题描述】:
我正在编写一个 C++ 程序,使用 SDL 2 作为平台层,使用 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 的映射。嗯
【问题讨论】:
-
我假设这与 SDL2 和大多数游戏检查游戏手柄和操纵杆的方式有关。我必须查看 SDL 代码才能确定。游戏手柄往往需要 xinput.dll 可检测到的驱动程序。我很确定您需要安装特殊的驱动程序,例如 SCPToolkit。泰拉瑞亚就是一个例子。您可以查看 DS3 控制器的 xinput 包装器,而不是 SDL2 API。
-
我不认为这就是它在 mac 上或一般情况下的工作方式,因为 SDL 应该为您处理所有疯狂的驱动程序。该控制器可与其他应用程序一起正常工作。此外,我需要使用 SDL 的系统来与我的输入系统的其余部分保持一致。我在关注这个:davidgow.net/handmadepenguin/ch6.html
-
我对Mac一无所知。查看源代码... mac 甚至不是操纵杆文件夹中的目录。不过,我确实看到了iphoneos。我可以告诉你,如果没有开发人员的支持,SDL2 不知道操纵杆和游戏手柄之间的区别。 IphoneOS 似乎只支持 Steam 和“GC”控制器。从您的链接中可以看出,这些是 Xbox 和 Steam 控制器。
-
SDL 使用控制器映射的文本文件。我不明白为什么 mac 需要一个特殊的文件夹。我很惊讶这个基本的东西没有得到很好的记录。唔。我认为您正在考虑 Windows 是如何做事的。
-
@ffhighwind Mac 目标文件夹是达尔文文件夹