我正在阅读有关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',我仍然可以拖动)但是为什么呢?另外,为什么只有拖放才能自动运行?为什么不调整大小?
答案 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事件堆栈。
现在窗口在某些平台上被冻结的原因是,这就是平台事件循环的工作方式,除非你“抽”它的事件循环,它将被视为一个无响应的窗口,窗口管理器将要杀死它及其过程