[英]SDL2 Key repeat delay
我正在尝试使用SDL 2.0.1开发强大的游戏输入系统。 我希望完全没有输入滞后。
我曾经使用SDL_GetKeyboardState()
来做到这一点,但是我转而使用SDL_Event
和SDL_PollEvent()
来为键盘,鼠标和操纵杆输入提供统一的接口(所有与事件有关的操作)。
这可以正常工作,但是如果在按住键(例如,移动字符)时希望连续输入,则SDL会注意到在重复键之前会有一点延迟。
在SDL 1.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!"
,然后在短时间内(大约一秒钟)不进行任何操作,然后重复打印直到松开键。
那么如何摆脱这种延迟呢?
由于你没有得到一个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
)用作键。
首先,您应该将事件轮询为循环,否则每帧只会得到一个事件,因此
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;
}
}
}
并且,要处理您的“按键延迟”,应创建一个带有按下按键的结构,以及按下按键时的时间戳。 您可以将这些结构放入向量中,然后在捕获到此键的键后将其删除。 要处理按键延迟,只需迭代您的按键,然后检查当前时间戳和按键按下初始时间戳之间的差异即可。
正如指出的在这里 ,正确的步骤,使这项工作的跨平台使用SDL keystates,而不是事件:
const Uint8* keystates = SDL_GetKeyboardState(NULL);
if(keystates[SDL_SCANCODE_DOWN])
{
printf("Key down!\n");
}
这样,您可以绕过任何基于OS的键盘延迟。 完整的教程: http : //lazyfoo.net/tutorials/SDL/18_key_states/index.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.