在我的SDL 1.2程序中,我有一個功能KeyPressed需要檢查一個鍵是否被按下。如果鼠標指針未在窗口前移動,則按下按鍵時,程序將按預期停止。另一方面,如果鼠標指針移動到窗口前,事件隊列似乎已經填滿,然後程序不響應按鍵。當沒有鍵盤事件時,有沒有辦法清空事件隊列?如何清空SDL事件隊列?
#include <SDL/SDL.h>
#include <stdio.h>
static void Init(int *error)
{
SDL_Surface *display;
*error = SDL_Init(SDL_INIT_VIDEO);
if (! *error) {
display = SDL_SetVideoMode(640, 480, 8, 0);
if (display != NULL) {
*error = 0;
} else {
fprintf(stderr, "SDL_SetVideoMode: %s\n", SDL_GetError());
*error = 1;
}
} else {
fprintf(stderr, "SDL_Init: %s\n", SDL_GetError());
*error = 1;
}
}
static int KeyPressed(void)
{
SDL_Event event;
int count, result;
result = 0;
SDL_PumpEvents();
count = SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_KEYDOWN));
switch (count) {
case -1:
fprintf(stderr, "SDL_PeepEvents: %s\n", SDL_GetError());
break;
case 0:
break;
case 1:
result = 1;
break;
}
return result;
}
int main(void)
{
int error;
Init(&error);
if (! error) {
do {
/*nothing*/
} while (! KeyPressed());
}
return error;
}
您必須從事件隊列中刪除事件,您是否嘗試過使用SDL_GETEVENT而不是SDL_PEEKEVENT? – nos 2014-11-25 14:35:09
@nos好的,但我應該刪除多少事件?據我所知,沒有辦法獲得事件隊列的長度。 – 2014-11-25 15:20:43
如果您首次執行SDL_PEEKEVENT,則會執行循環,如果返回非零值,則執行SDL_GETEVENT。如果它返回零,則清空事件隊列。雖然,目前還不清楚這個代碼是否只是真正的應用程序的一部分 - 控制流和檢查關鍵事件通常會非常不同 - 並且經常按照這裏所示進行處理http://stackoverflow.com/questions/3741055/inputs- in-sdl-on-key-pressed – nos 2014-11-25 15:29:29