当我试图理解SDL中的事件是如何工作的时候,我注意到在我的测试程序中很早就发生了3个事件。以下代码打印每个事件的类型。
int main(int argc, char **argv)
{
int on = 1;
SDL_Surface *screen = NULL;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WaitEvent(&event);
fprintf(stderr, "%d\n", event.type);
SDL_WaitEvent(&event);
fprintf(stderr, "%d\n", event.type);
SDL_WaitEvent(&event);
fprintf(stderr, "%d\n", event.type);
SDL_Quit();
}
输出:
17
16
1
SDL_VIDEOEXPOSE
类型。SDL_VIDEORESIZE
类型。SDL_ACTIVEVENT
类型。我知道启动SDL程序时会发生这样的事情:必须给窗口一个大小,并且必须给它一个可见性。但是我没有得到的是,在初始化窗口后,函数SDL_WaitEvent
填充event
这些事件。如果你查看我的代码,你可以看到它只会等待一个事件并在stderr
中打印它的类型。启动程序后我没有触及任何内容,但是在event
中创建并填充了3个事件。我在wiki和doc以及一些网站上看到了“队列”的概念,但它从未被解释过,所以我只能想象它可能与它有关,因为它看起来像是3个事件等待放入SDL_Event
。
我想知道发生了什么。为什么3个事件(始终相同且顺序相同)会显示并填充event
?
答案 0 :(得分:2)
队列通常与异步事件接口一起使用。 Queue 是抽象数据容器类型的名称,可以存储一组其他类型(在此具体方案中:一组SDL_Event
s),其中包含添加项目和检索的功能一个项目,并且检索功能(通常称为dequeue()
)始终返回(并删除)首先放入队列的项目。这也称为 FIFO :先进先出。
SDL_WaitEvent()
非常类似于普通dequeue()
操作(用于从队列中检索项目),唯一的区别是如果队列中没有任何内容,它将等待事件。
因此,您看到的3个事件是在初始化期间创建的,并且在您呼叫SDL_WaitEvent()
时已在队列中等待;他们突然不"出现"。他们在那里是因为可能是对新窗口创建做出反应的理由,或者它被调整大小。