SDL_GAMECONTROLLERCONFIG vs. SDL_GameControllerAddMappingsFr

SDL_GAMECONTROLLERCONFIG vs. SDL_GameControllerAddMappingsFromFile

本文关键字:SDL GameControllerAddMappingsFr GAMECONTROLLERCONFIG vs      更新时间:2023-10-16

我在游戏中使用SDL_GameControllerAddMappingsFromFile,并在gamecontrollerdb.txt文件中添加了一个新的游戏控制器。我使用SDL2 Gamepad工具创建映射,并将其添加到gamecontrollerdb.txt文件中。如果我将环境变量SDL_GAMECONTROLLERCONFIG设置为指向映射,那么一切都正常。但是,当我删除环境变量时,即使将相同的映射添加到文件中,映射也不起作用。

我使用了此处指定的相应工具check.py:https://github.com/gabomdq/SDL_GameControllerDB

工具显示文件看起来不错。我使用的是SDL2(2.0.9)的最新官方版本,运行在Windows10下。我的代码是跨平台的,我在Raspian下进行了测试,结果同样令人沮丧。

Windows可以识别具有正确名称的蓝牙控制器,并且在加载文件时没有收到错误消息(在我看来,读取文件时根本没有错误检查)。

我已经用其他几个游戏控制器测试了代码,它们在Windows/OSX和Linux上可以正常工作。

if (SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt") == -1) {
std::cout << "Warning: Failed to load game controller mappings: " << SDL_GetError() << std::endl;
}

实际使用控制器的代码如下所示:https://github.com/drpatrik/combatris/blob/develop/combatris/src/combatris.cpp

我希望控制器能够被识别,因为映射显然是有效的,并且被添加到文件中。

我发现了问题所在。一些游戏手柄被视为操纵杆,这意味着你需要同时打开游戏手柄和操纵杆事件,并收听两者的附加事件:

SDL_JoystickEventState(SDL_ENABLE);
SDL_GameControllerEventState(SDL_ENABLE);

以及:

...
case SDL_JOYDEVICEADDED:
case SDL_CONTROLLERDEVICEADDED: