2017-03-01 17 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イベントに変換し、SDLイベントスタックにプッシュします。

Windowsがいくつかのプラットフォームでフリーズしている理由は、そのプラットフォームイベントループがどのように機能するかです。イベントループを「励起」しないと応答しないウィンドウとみなされ、ウィンドウマネージャーはそれを強制終了しますそのプロセス。