繁体   English   中英

SDL2按键重复延迟

[英]SDL2 Key repeat delay

我正在尝试使用SDL 2.0.1开发强大的游戏输入系统。 我希望完全没有输入滞后。

我曾经使用SDL_GetKeyboardState()来做到这一点,但是我转而使用SDL_EventSDL_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_Keycodeevent.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM