C++ SDL2环境下如何实现无延迟的持续按键输入功能?
你遇到的延迟是操作系统默认的按键重复触发机制加上代码写法错误共同导致的:
SDL_GetKeyboardState本身返回的是键盘实时按下状态,不需要依赖事件触发就能读取- 你现在把按键检测逻辑写在了
SDL_PollEvent的内部循环里,只有当有新的键盘/系统事件产生时,这部分检测代码才会执行。而系统默认长按按键时,第一次按下触发事件后,会等待约1秒才会持续产生重复的按键事件,所以你的移动逻辑也跟着出现了对应的延迟。
修复方法
把按键检测逻辑从事件轮询的内部循环,移到外层的主游戏循环中,每次主循环都会主动检测当前按键状态,直接更新位置,不需要等事件触发即可实现无延迟响应。
修改后的参考代码:
while (gameRunning) { SDL_Event event; const Uint8* keystates = SDL_GetKeyboardState(NULL); // 事件轮询仅处理事件类逻辑 while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { gameRunning = false; } } // 按键状态检测移到事件循环外,主循环每次运行都会执行 if (keystates[SDL_SCANCODE_W]) { entities[0].setY(entities[0].getY() - 1); } if (keystates[SDL_SCANCODE_S]) { entities[0].setY(entities[0].getY() + 1); } if (keystates[SDL_SCANCODE_A]) { entities[0].setX(entities[0].getX() - 1); } if (keystates[SDL_SCANCODE_D]) { entities[0].setX(entities[0].getX() + 1); } // 建议补充帧率控制逻辑,避免移动速度随设备帧率波动 // 示例:SDL_Delay(16); 限制约60帧运行 }
内容的提问来源于stack exchange,提问作者Wulfo
相关产品推荐
相关产品推荐

