[前一页] 目录 [后一页]

使用SDL

事件

  • 等待事件

调用SDL_WaitEvent()等待事件。

提示:
SDL支持国际键盘,解释键盘事件,并支持UNICODE(置于event.key.keysym.unicode)。由于Unicode支持需要额外的处理,当需要Unicode时必须先调用 SDL_EnableUNICODE()。
例程:
{
    SDL_Event event;

    SDL_WaitEvent(&event);

    switch (event.type) {
        case SDL_KEYDOWN:
            printf("键 %s 按下了!\n",
                   SDL_GetKeyName(event.key.keysym.sym));
            break;
        case SDL_QUIT:
            exit(0);
    }
}
  • 事件轮询

事件轮询调用SDL_PollEvent()函数。

提示:
如果只要查看(peek)事件,而不需要从事件队列中移走,你可以用SDL_PEEKEVENT作为参数调用SDL_PeepEvents()。
例程:
{
    SDL_Event event;

    while ( SDL_PollEvent(&event) ) {
        switch (event.type) {
            case SDL_MOUSEMOTION:
                printf("鼠标移动了%d,%d 到 (%d,%d)\n",
                       event.motion.xrel, event.motion.yrel,
                       event.motion.x, event.motion.y);
                break;
            case SDL_MOUSEBUTTONDOWN:
                printf("鼠标 %d 点击在 (%d,%d)\n",
                       event.button.button, event.button.x, event.button.y);
                break;
            case SDL_QUIT:
                exit(0);
        }
    }
}
  • 事件状态轮询

除了直接处理事件,每种类型的事件都有一个相应的函数可以用作检查事件的状态。如果你需要独占使用,应该调用 SDL_EventState() 忽略所有的事件,并且定期的调用SDL_PumpEvents()更新程序的事件状态。

提示:
SDL_ShowCursor()可以显示或者隐藏光标/鼠标。
例程:
{
    SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
}

void CheckMouseHover(void)
{
    int mouse_x, mouse_y;

    SDL_PumpEvents();

    SDL_GetMouseState(&mouse_x, &mouse_y);
    if ( (mouse_x < 32) && (mouse_y < 32) ) {
        printf("鼠标在左上角!\n");
    }
}

[前一页] 目录 [后一页]