SDL_PollEvent有什么作用?

时间:2017-03-01 15:01:49

标签: c++ sdl sdl-2

我正在阅读有关SDL的介绍性书籍代码,并且有类似的示例代码:

void Game::handleEvents()
{
    SDL_Event event;
    if (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
        case SDL_QUIT:
            m_bRunning = false;
            break;
        default:
            break;
        }
    }
}

我知道这将调查事件队列,如果有什么,请检索它并将其运行到switch语句。在添加此代码之前,窗口已显示,但您无法拖放,关闭或调整窗口大小。现在我添加了这段代码,我可以关闭窗口,这是我的预期。我没想到的是我能够拖放窗户。

我认为这将是一个单独的事件,我将来需要包含在switch语句中。为什么拖放也有效?它是SDL_PollEvent(因为我评论了switch语句但是留下'if',我仍然可以拖动)但是为什么呢?另外,为什么只有拖放才能自动运行?为什么不调整大小?

2 个答案:

答案 0 :(得分:3)

我们不需要处理所有事件,一些SDL会为我们处理。与窗口属性相关的事件将自动处理。为了调整窗口大小,您必须在创建窗口时添加标志SDL_WINDOW_RESIZABLE。虽然SDL会处理窗口的实际大小调整,但它可能仍然需要一些事件处理,因为表面将具有不同的绘制大小,它不会自动调整我们尝试在其中绘制的任何图像。

虽然我没有在文档中找到答案为什么 SDL_PollEvent的行为如上所述,或者如果这是行为,但它在不同系统上的工作方式略有不同。在osx中​​,可以在没有上述功能的情况下移动窗口,但不会显示关闭的X.通过再次添加该功能,可以正确移动,最小化和关闭窗口。

根据documentation,SDL_PollEvent旨在执行您描述的操作,查看是否存在任何事件并检索它们。

答案 1 :(得分:2)

事件现在没有发生,它们已经发生在过去,您收到的通知表明它们确实按照它们发生的顺序发生。

冻结窗口是实现细节的副作用,设置适当的标志以启用/禁用窗口属性和功能,如调整大小,全屏等等。

SDL_PollEvent调用SDL_PumpEvents,删除堆栈中的第一个事件并将其复制到给定的指针中。

SDL_PumpEvents调用操作系统的事件处理API并将平台事件转换为SDL_Events,将它们推送到SDL事件堆栈。

现在窗口在某些平台上被冻结的原因是,这就是平台事件循环的工作方式,除非你“抽”它的事件循环,它将被视为一个无响应的窗口,窗口管理器将要杀死它及其过程