2012-07-22 105 views
3

然而,我打电话SDL_PeepEvents(sdlevent, EVENT_BUFFER_SIZE, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_SYSWMEVENT);然而,在运行时间几秒钟后,并且调整窗口大小(调整大小/移动/最小化)时,它将不会在单击关闭窗口时拾取事件。SDL_PeepEvents不会处理窗口关闭

void Window::pollWindowEvents() 
{ 
    const int EVENT_BUFFER_SIZE = 16; 
    SDL_Event sdlevent[ EVENT_BUFFER_SIZE ]; //The SDL event that we will poll to get events. 

    SDL_PumpEvents(); 
    int numEvents = SDL_PeepEvents(sdlevent, EVENT_BUFFER_SIZE, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_SYSWMEVENT); 

    std::cout << numEvents << std::endl; 

    for (int i = 0; i < numEvents; ++i) 
    { 
     switch (sdlevent[ i ].type) 
     { 
     case SDL_QUIT: 
      closed = true; 
      std::cout << sdlevent[ i ].type << std::endl; 
      break; 
     default: 
      std::cout << sdlevent[ i ].type << std::endl; 
      break; 
     }; 
    } 
} 

有没有人知道我在做什么错了?

+0

您每帧只能处理最多16个事件。队列中还有很多事件,需要一些时间以这种速度处理它们。你为什么不使用'SDL_PollEvent'? – 2012-07-28 08:01:29

+0

我没有使用'SDL_PollEvent',因为我想单独处理键盘事件。我一直有意将解决方案发布几天,但似乎事件队列正在满足我实际没有处理的事件。一旦我开始处理它们,我发现它工作正常。然而,我最终处理它们的方式将允许我使用'SDL_PollEvent',现在已经提到我可能会这样做。 – ctor 2012-07-28 11:54:41

回答

1

当调用SDL_PeepEvents()时,我只处理队列中选定范围的事件,其余事件未经处理。这导致事件队列由于这些未处理的事件而变得饱和,并因此停止了我想要处理的事件。这很容易通过处理事件队列中的所有事件来解决。