调用GetAnalogActionData时Steam Input触发段错误求助
SDL2结合Steamworks开发时调用GetAnalogActionData触发段错误排查
我正在用SDL2开发游戏,通过Steamworks实现控制器支持,但调用GetAnalogActionData时程序触发段错误(SEGFAULT)。开发环境是MSYS2下的MinGW g++,采用Steamworks API 157版本。我知道应该缓存句柄,但程序一尝试读取数据就立刻崩溃,无法进行后续调试,希望找出问题根源。
代码实现
#include <SDL2/SDL.h> #include <steam/steam_api.h> SDL_Window *window; SDL_Renderer *renderer; bool isRunning = true; using namespace std; int init() { // Initialize Steam API if (!SteamAPI_Init()) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Failed to initialize Steam API!"); return 1; } // Initialize Steam Input if (!SteamInput()->Init(false)) { SDL_LogCritical(SDL_LOG_CATEGORY_INPUT, "Failed to initialize Steam Input!"); return 1; } { int res = SDL_Init(SDL_INIT_EVERYTHING); if (res < 0) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Failed to initialize SDL: %s", SDL_GetError()); return res; } } window = SDL_CreateWindow(">:(", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 640, SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL); if (window == nullptr) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Failed to create window: %s", SDL_GetError()); return 1; } renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (renderer == nullptr) { SDL_LogCritical(SDL_LOG_CATEGORY_APPLICATION, "Failed to create renderer: %s", SDL_GetError()); return 1; } SDL_Log("initialized"); return 0; } void shutdown() { SDL_Log("shutting down"); SDL_Quit(); SteamAPI_Shutdown(); SDL_Log("goodnight"); } void tick() { SDL_Event ev; while (SDL_PollEvent(&ev)) { switch (ev.type) { case SDL_WINDOWEVENT: // fallthrough if event is closing the window if (ev.window.event != SDL_WINDOWEVENT_CLOSE) { break; } case SDL_QUIT: { isRunning = false; return; break; } case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: { const char* buttonName = SDL_GameControllerGetStringForButton((SDL_GameControllerButton)ev.cbutton.button); printf("Button %s %s\n", buttonName, (ev.cbutton.state ? "DOWN" : "UP")); break; } } } SteamAPI_RunCallbacks(); SDL_SetRenderDrawColor(renderer, 0.f, 0.f, 0.f, 0.f); SDL_RenderClear(renderer); SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); #ifdef USE_STEAM SteamAPI_RunCallbacks(); #endif // USE_STEAM // render SDL_Rect rect = {100, 100, 480, 480 }; InputAnalogActionHandle_t AnalogControls = SteamInput()->GetAnalogActionHandle ("AnalogControls"); InputActionSetHandle_t GameControls = SteamInput()->GetActionSetHandle("GameControls"); InputHandle_t controllers[STEAM_INPUT_MAX_COUNT]{}; SteamInput()->GetConnectedControllers(controllers); SteamInput()->ActivateActionSet(controllers[0], GameControls); InputAnalogActionData_t data = SteamInput()->GetAnalogActionData(controllers[0], AnalogControls); printf("data: { %f, %f }\n", data.x, data.y); SDL_SetRenderDrawColor(renderer, uint8_t(data.x * float(0xFF)), uint8_t(data.y * float(0xFF)), 0, SDL_ALPHA_OPAQUE); SDL_RenderFillRect(renderer, &rect); SDL_RenderPresent(renderer); #ifdef NDEBUG GLenum err = glGetError(); if (err != 0) SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "%x %s", err, glewGetErrorString(err)); #endif } int main(int argc, char* argv[]) { SDL_Log("running"); #ifdef NDEBUG SDL_LogSetAllPriority(SDL_LOG_PRIORITY_DEBUG); #endif { int i = init(); if (i) return i; } while (isRunning) tick(); shutdown(); return 0; }
调试关键值
controllers[0]值为319124578728929405AnalogControls值为1GameControls值为1
IGA配置文件(game_actions_480.vdf)
我使用默认的Spacewar应用ID(480)开发,配置文件内容如下:
"In Game Actions" { "actions" { "GameControls" { "title" "#Set_GameControls" "StickPadGyro" { "AnalogControls" { "title" "#Action_AnalogControls" "input_mode" "joystick_move" } } "Button" { "jump" "#Action_Jump" } } "MenuControls" { "title" "#Set_MenuControls" "Button" { "menu_up" "#Action_MenuUp" "menu_down" "#Action_MenuDown" "menu_left" "#Action_MenuLeft" "menu_right" "#Action_MenuRight" "menu_select" "#Action_MenuSelect" "menu_cancel" "#Action_MenuCancel" } } } "localization" { "english" { "Title_Config1" "Officially Configurated Configuration" "Description_Config1" "sdalskdjaksjda." "Set_GameControls" "In-Game Controls" "Set_MenuControls" "Menu Controls" "Action_AnalogControls" "Analog Controls" "Action_Jump" "Jump" "Action_MenuUp" "Menu Up" "Action_MenuDown" "Menu Down" "Action_MenuLeft" "Menu Left" "Action_MenuRight" "Menu Right" "Action_MenuSelect" "Menu Select" "Action_MenuCancel" "Menu Cancel" } } }
内容的提问来源于stack exchange,提问作者addiment
相关产品推荐
相关产品推荐

