如何正确使用SDL_PeepEvents?

时间:2014-10-09 14:58:16

标签: c sdl

当我调用函数 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;
}

1 个答案:

答案 0 :(得分:2)

文档说明在使用SDL_INIT_VIDEO时隐式SDL_INIT_EVENTS。

您需要在循环中添加对SDL_PumpEvents的调用,否则不会有任何消息进入队列。

SDL_PumpEvents从设备收集所有待处理的输入信息并将其放在事件队列中。如果不调用SDL_PumpEvents,则不会在队列上放置任何事件。由于SDL_PollEvent和SDL_WaitEvent隐式调用SDL_PumpEvents,因此通常需要对用户隐藏对SDL_PumpEvents的调用。但是,如果您没有轮询或等待事件(例如,您正在过滤它们),则必须调用SDL_PumpEvents以强制更新事件队列。