SDL 2 无法打开控制器,但可以识别操纵杆
SDL 2 Cannot Open Controller but Joystick Recognized
我正在编写一个 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的"version 2",我不确定是否添加了2.0.5兼容的映射。嗯嗯
控制器被识别为操纵杆而不是控制器,这意味着 none 我能找到的可用映射(以 2.0.5 控制器映射格式)与控制器相对应。从 SDL 2.0.5 更新到 2.0.8 似乎也更新了可用的映射,现在控制器被识别为游戏控制器。
注意:通常在项目中期升级工具是个糟糕的主意,但在这种情况下这样做是安全的。
我正在编写一个 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的"version 2",我不确定是否添加了2.0.5兼容的映射。嗯嗯
控制器被识别为操纵杆而不是控制器,这意味着 none 我能找到的可用映射(以 2.0.5 控制器映射格式)与控制器相对应。从 SDL 2.0.5 更新到 2.0.8 似乎也更新了可用的映射,现在控制器被识别为游戏控制器。
注意:通常在项目中期升级工具是个糟糕的主意,但在这种情况下这样做是安全的。