当我调用函数 PeekEvents 时,程序在标准输出上打印零,即使在SDL窗口具有焦点时键入键盘,也永远不会完成。为什么函数没有抓住我的击键?
void PeekEvents(void)
{
SDL_Event events[1];
int count;
do {
count = SDL_PeepEvents(events, LEN(events), SDL_PEEKEVENT, SDL_EVENTMASK(SDL_KEYDOWN));
printf("%d\n", count);
} while (count == 0);
}
这是完整的程序:
#include <SDL/SDL.h>
#include <stdio.h>
#define LEN(a) ((int) (sizeof (a) / sizeof (a)[0]))
static void PeekEvents(void)
{
SDL_Event events[1];
int count;
do {
count = SDL_PeepEvents(events, LEN(events), SDL_PEEKEVENT, SDL_EVENTMASK(SDL_KEYDOWN));
printf("%d\n", count);
} while (count == 0);
}
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;
}
}
int main(void)
{
int error;
Init(&error);
if (! error) {
PeekEvents();
}
return error;
}
答案 0 :(得分:2)
文档说明在使用SDL_INIT_VIDEO时隐式SDL_INIT_EVENTS。
您需要在循环中添加对SDL_PumpEvents的调用,否则不会有任何消息进入队列。
SDL_PumpEvents从设备收集所有待处理的输入信息并将其放在事件队列中。如果不调用SDL_PumpEvents,则不会在队列上放置任何事件。由于SDL_PollEvent和SDL_WaitEvent隐式调用SDL_PumpEvents,因此通常需要对用户隐藏对SDL_PumpEvents的调用。但是,如果您没有轮询或等待事件(例如,您正在过滤它们),则必须调用SDL_PumpEvents以强制更新事件队列。