我试图开发一个强大的游戏输入系统与SDL2.0.1。我希望没有输入延迟。
我过去经常用SDL_GetKeyboardState()来完成这个任务,但是我转而使用SDL_Event和SDL_PollEvent()来为键盘、鼠标和Keyboard输入提供统一的接口(所有这些都是用事件完成的)。
这很好,但是如果我想在按住键时连续输入(例如,移动一个字符),在SDL注意到该键正在重复之前,会有一个轻微的延迟。
在SDL1.2中,可以使用函数调用来设置此延迟。现在已经不是了(据我所知)。
我怎样才能消除这个延迟呢?我应该切换到直接读取键盘状态吗?
供参考,这是我目前如何获得输入..。
SDL_Event sdlEvent;
while (running)
{
SDL_PollEvent(&sdlEvent);
switch (sdlEvent.type)
{
case SDL_QUIT:
running = false;
break;
case SDL_KEYDOWN:
printf("Key down!\n");
break;
default:
break;
}
}应用程序打印"Key down!",然后暂时不打印(大约一秒),然后反复打印,直到密钥被释放。
那我该怎么摆脱这个延迟呢?
发布于 2014-01-23 16:00:56
因为你没有得到一个SDL_KEYUP,你只需要一个bool,那就是true,直到你得到一个SDL_KEYUP
SDL_Event sdlEvent;
while (running)
{
bool keyDown = false;
while ( SDL_PollEvent(&sdlEvent) )
{
switch (sdlEvent.type)
{
case SDL_QUIT:
running = false;
break;
case SDL_KEYDOWN:
keyDown = true;
break;
case SDL_KEUP:
keyDown = false;
break;
default:
break;
}
}
if ( keyDown )
printf("Key down!\n");
}当然,您需要一些东西来存储所有的键,比如数组。(或者更好地使用C++和std::map)然后您可以使用SDL_Keycode ( event.key.keysym.sym )作为键。
发布于 2014-01-23 16:01:03
首先,您应该将事件轮询到一个循环中,否则每个帧只会得到一个事件
SDL_Event sdlEvent;
while (running)
{
while(SDL_PollEvent(&sdlEvent))
{
switch (sdlEvent.type)
{
case SDL_QUIT:
running = false;
break;
case SDL_KEYDOWN:
printf("Key down!\n");
break;
default:
break;
}
}
}并且,要处理您的密钥延迟,应该创建一个按下键的结构,以及启动键时的时间戳。您可以将这些结构放入向量中,然后在为该键抓起键时将其移除。要处理密钥延迟,只需迭代您的密钥,并检查当前时间戳和按下键时间戳之间的差异。
发布于 2018-05-30 03:41:55
正如我们所注意到的,使此跨平台工作的正确过程是使用SDL键击键而不是事件:
const Uint8* keystates = SDL_GetKeyboardState(NULL);
if(keystates[SDL_SCANCODE_DOWN])
{
printf("Key down!\n");
}这样,您就可以绕过任何基于OS的键盘延迟。完整教程:states/index.php
https://stackoverflow.com/questions/21311824
复制相似问题