C ++和SDL一次无法在屏幕上获得超过3个图像

时间:2014-01-31 22:32:28

标签: c++ image keyboard sdl

我正在尝试制作一个屏幕键盘程序,当我按下一个给定的键时,它的图片显示在屏幕上,但我发现当我在键盘上完全按下A,B,C和D时,只有A,B和C出现了。当我尝试以不同的顺序按键时,总会有一个字母没有出现。我在网上找不到任何回答我的问题。我的代码(我现在只检测到A,B,C和D):

Uint8 *key = SDL_GetKeyState(NULL);

SDL_Surface *alphabet = SDL_LoadBMP("keys/letters/alphabet.bmp");

SDL_Rect A;
A.x = 150;
A.y = 156;
A.w = 106;
A.h = 123;

SDL_Rect B;
B.x = 322;
B.y = 160;
B.w = 106;
B.h = 123;

SDL_Rect b;
b.x = 110;

SDL_Rect C;
C.x = 525;
C.y = 162;
C.w = 106;
C.h = 123;

SDL_Rect c;
c.x = 220;

SDL_Rect D;
D.x = 735;
D.y = 163;
D.w = 106;
D.h = 123;

SDL_Rect d;
d.x = 330;

while(running == true)
{
    SDL_PollEvent(&eventhandler);
    if(eventhandler.type == SDL_QUIT)
        running = false;

    SDL_FillRect(screen,NULL,0xFFFFFF);

    if(key[SDLK_a])
        SDL_BlitSurface(alphabet,&A,screen,NULL);

    if(key[SDLK_b])
        SDL_BlitSurface(alphabet,&B,screen,&b);

    if(key[SDLK_c])
        SDL_BlitSurface(alphabet,&C,screen,&c);

    if(key[SDLK_d])
        SDL_BlitSurface(alphabet,&D,screen,&d);

    SDL_Flip(screen);
}`

2 个答案:

答案 0 :(得分:0)

我很确定这与硬件而不是软件有关,键盘只是不会获得比一次更多的输入。 您可以使用SDL_Event并在程序中打开/关闭bool来控制每个按钮纹理,而不是使用keystates。

答案 1 :(得分:0)

你需要在一个循环中查询你的事件,因为使用你正在使用的方法,每帧只能获得一个事件,即使在轮询中有20个事件等待,你只是在每一帧中弹出最后一个事件

考虑将代码更改为

SDL_Event evt;
while(SDL_PollEvent(&evt))
{
   //event handling here
}

并使用此

Uint8 *key = SDL_GetKeyState(NULL);

你需要在每一帧都获得关键状态......不仅仅是在开始时。 您需要使用SDL_PumpEvents来更新阵列。  假设PolEEvent调用PumpEvents。但是,我发现使用PollEvent的循环比使用KeyboardState数组更好。