2017-03-01 49 views
0

我閱讀有關SDL入門書代碼,並有示例代碼是這樣的:SDL_PollEvent做什麼?

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

它應該是'while',而不是'if'。但是,是的,在幾乎所有情況下,您都必須響應特定於平臺的消息(SDL在生成事件隊列時內部執行此操作),否則窗口系統將不會更新,甚至不允許用戶允許終止不響應其信號的應用程序。 – keltar

回答

3

我們不需要處理所有事件,有些SDL會爲我們照顧。與窗口屬性相關的事件將被自動處理。爲了調整窗口大小,創建窗口時必須添加標誌SDL_WINDOW_RESIZABLE。雖然SDL將負責實際調整窗口大小,但仍可能需要一些事件處理,因爲表面將具有不同的大小繪製,它不會自動調整我們嘗試繪製的任何圖像的大小。

儘管我還沒有在文檔中找到答案爲什麼 SDL_PollEvent的行爲如上所述,或者如果這是行爲的目的,它在不同系統上的工作方式稍有不同。在osx中​​,可以在不使用上述功能的情況下移動窗口,但關閉的X將不會顯示。再次添加該功能,窗口可以移動,最小化並正確關閉。

根據documentation,SDL_PollEvent是爲了做你所描述的,看看是否有任何事件並檢索它們。

2

事件現在不會發生,它們已經發生在過去,您收到的通知確實是按照它們發生的順序發生的。

將冷凍的窗口是一個實現細節的副作用,設置適當的標誌來啓用/禁用窗口屬性和類似的調整大小,全屏功能性等

SDL_PollEvent呼叫SDL_PumpEvents,去除在堆疊中的第一事件和將其複製到指定的指針中。

SDL_PumpEvents調用操作系統的事件處理API並將平臺事件轉換爲SDL_Events,並將它們推送到SDL事件堆棧中。

現在,Windows在某些平臺上被凍結的原因是,那是平臺事件循環的工作方式,除非您「泵送」其事件循環,否則它將被視爲無響應的窗口,窗口管理器將希望終止它並其過程。