奇怪的SDL键盘问题

时间:2017-11-21 08:12:22

标签: c++ keyboard sdl sdl-2

所以我在运行两个不同操作系统的两台机器上试过这个,并且它们之间也发生了同样的事情。

#include <iostream>
#include <SDL2/SDL.h>

int main(int argc, char *argv[])
{

bool running = true;

SDL_Init( SDL_INIT_EVERYTHING);

SDL_Window* win = SDL_CreateWindow("test", 100, 100, 800, 600, 
SDL_WINDOW_SHOWN);
SDL_Renderer* ren = SDL_CreateRenderer(win, -1, 0);

int r = 0;

while(running)
{
    SDL_Event event;
    SDL_PollEvent(&event);

    switch(event.type)
    {
        case SDL_QUIT:
            running = false;
            break;

        case SDL_KEYDOWN:
            switch(event.key.keysym.sym)
            {
                case SDLK_d:
                    r++;
                    break;
                case SDLK_RIGHT:
                    r++;
                    break;
            }
            break;
    }

    SDL_SetRenderDrawColor(ren, r, 255, 255, 255);
    SDL_RenderClear(ren);

    SDL_RenderPresent(ren);
}

SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();

return 0;
}

当按住右箭头键时,它会闪烁,r增加得更快。

按住d时,它会慢慢增加。

为什么?

1 个答案:

答案 0 :(得分:3)

如果有待处理事件,则

SDL_PollEvent返回1;如果没有可用事件,则返回0。即使您没有理由,也无法检查返回状态并查看事件。您在这里找到的内容几乎未定义(很可能只是旧数据 - 一遍又一遍地读同一事件,即使它经常不会发生)。

在循环中完成正确的事件处理:

while(running) {
    SDL_Event ev;
    while(SDL_PollEvent(&ev)) {
        // process event here
    }
    // draw here
}