C SDL 键盘事件 SDL_KEYUP 按键按下时触发

标签 c events keyboard sdl keyup

我在 C 中使用 SDL,我试图让一个角色在按下某个键时在屏幕上移动,并在它被释放时停止,但看起来好像是在按下键时触发了 KEYUP 事件仍然被压制。如果我删除 pressed() 中的 KEYUP 部分,字符将在屏幕上滑动,但显然不会自行停止。如果我保留 KEYUP 部分,我必须反复按下该键才能在屏幕上移动它们。 知道我做错了什么吗?

这是我所拥有的:

...

int done = 0;
while (done==0)
{
    pressed();
    if (kenter == 1)
    {
        state = 1;
        subscreen();
    }
    if (kescape == 1)
    {
        done = 1;
    }
    if (kup == 1)
    {
        playery += -2;
    }
    if (kdown == 1)
    {
        playery += 2;
    }

    if (kright == 1)
    {
        playerx += 2;
    }
    if (kleft == 1)
    {
        playerx += - 2;
    }

...

int pressed ()
{

SDL_Event keyevent;

while (SDL_PollEvent(&keyevent))
{
    switch(keyevent.type)
    {
        case SDL_KEYDOWN:
        switch(keyevent.key.keysym.sym)
        {
            case SDLK_RETURN:
            {
                kenter = 1;
                break;
            }
            case SDLK_ESCAPE:
            {
                kescape = 1;
                break;
            }
            case SDLK_a:
            {
                ka = 1;
                break;
            }
            case SDLK_s:
            {
                ks = 1;
                break;
            }
            case SDLK_UP:
            {
                kup = 1;
                break;
            }
            case SDLK_DOWN:
            {
                kdown = 1;
                break;
            }
            case SDLK_RIGHT:
            {
                kright = 1;
                break;
            }
            case SDLK_LEFT:
            {
                kleft = 1;
                break;
            }
            default:
            break;
        }
    }
    switch(keyevent.type)
    {
        case SDL_KEYUP:
        switch(keyevent.key.keysym.sym)
        {
            case SDLK_RETURN:
            {
                kenter = 0;
                break;
            }
            case SDLK_ESCAPE:
            {
                kescape = 0;
                break;
            }
            case SDLK_a:
            {
                ka = 0;
                break;
            }
            case SDLK_s:
            {
                ks = 0;
                break;
            }
            case SDLK_UP:
            {
                kup = 0;
                break;
            }
            case SDLK_DOWN:
            {
                kdown = 0;
                break;
            }
            case SDLK_RIGHT:
            {
                kright = 0;
                break;
            }
            case SDLK_LEFT:
            {
                kleft = 0;
                break;
            }
            default:
            break;
        }
    }
}
return 0;
}

最佳答案

我认为您的 switch 语句已损坏。

使用这种不那么困惑的方式

int pressed ()
{

    SDL_Event event;

    while(SDL_PollEvent(&event) )
    {
        if(event.type == SDLK_KEYDOWN)
        {
                switch(event.key.keysym.sym)
                {
                    case SDLK_RETURN:
                        doStuff = 1
                        break;
                    default:
                        break;
                }
        }
        if(event.type == SDLK_KEYUP)
        {
                switch(event.key.keysym.sym)
                {
                    case SDLK_RETURN:
                        doStuff = 0;
                        break;
                    default:
                        break;
                }
        }
    }   
}

同样重要的是:

SDL Tutorials: Practical Keyboard Input

哦,避免使用全局变量!

关于C SDL 键盘事件 SDL_KEYUP 按键按下时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14102348/

相关文章:

android - Android 中的事件坐标和 View 坐标不匹配?

java - 将 UI 与事件处理程序分离

javascript - Node js 捕获键盘按下和鼠标移动(不在 Web 浏览器上)

c - jemalloc、mmap 和共享内存?

C# 事件作为方法中的参数

c++ - 获取时间作为文件名

android - 显示虚拟键盘时调整 QML 窗口大小

ios - 以编程方式添加文本替换

c - 帮助将指针强制转换为 union

c - 指针和 realloc 的问题,C 中的程序崩溃错误