我正在尝试制作一个屏幕键盘程序,当我按下一个给定的键时,它的图片显示在屏幕上,但我发现当我在键盘上完全按下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);
}`
答案 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数组更好。