首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL2密钥重复延迟

SDL2密钥重复延迟
EN

Stack Overflow用户
提问于 2014-01-23 15:02:23
回答 3查看 7.9K关注 0票数 1

我试图开发一个强大的游戏输入系统与SDL2.0.1。我希望没有输入延迟。

我过去经常用SDL_GetKeyboardState()来完成这个任务,但是我转而使用SDL_EventSDL_PollEvent()来为键盘、鼠标和Keyboard输入提供统一的接口(所有这些都是用事件完成的)。

这很好,但是如果我想在按住键时连续输入(例如,移动一个字符),在SDL注意到该键正在重复之前,会有一个轻微的延迟。

在SDL1.2中,可以使用函数调用来设置此延迟。现在已经不是了(据我所知)。

我怎样才能消除这个延迟呢?我应该切换到直接读取键盘状态吗?

供参考,这是我目前如何获得输入..。

代码语言:javascript
复制
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!",然后暂时不打印(大约一秒),然后反复打印,直到密钥被释放。

那我该怎么摆脱这个延迟呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-23 16:00:56

因为你没有得到一个SDL_KEYUP,你只需要一个bool,那就是true,直到你得到一个SDL_KEYUP

代码语言:javascript
复制
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 )作为键。

票数 3
EN

Stack Overflow用户

发布于 2014-01-23 16:01:03

首先,您应该将事件轮询到一个循环中,否则每个帧只会得到一个事件

代码语言:javascript
复制
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;
        }
    }
}

并且,要处理您的密钥延迟,应该创建一个按下键的结构,以及启动键时的时间戳。您可以将这些结构放入向量中,然后在为该键抓起键时将其移除。要处理密钥延迟,只需迭代您的密钥,并检查当前时间戳和按下键时间戳之间的差异。

票数 2
EN

Stack Overflow用户

发布于 2018-05-30 03:41:55

正如我们所注意到的,使此跨平台工作的正确过程是使用SDL键击键而不是事件:

代码语言:javascript
复制
const Uint8* keystates = SDL_GetKeyboardState(NULL);

if(keystates[SDL_SCANCODE_DOWN])
{
    printf("Key down!\n");    
}

这样,您就可以绕过任何基于OS的键盘延迟。完整教程:states/index.php

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21311824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档