第一章「SDLの基本的な使い方」第六話


前回に引き続き、イベントの機能を紹介していきます。 今日は関数です。

SDL_PollEvent()


この関数は、SDL_Event構造体の変数を引数に使い、イベントが待機中かどうかを認識します。

待機中と書きましたが、イベントとは、常に何種類も何度も起こるものなので、それらひとつひとつに 様々な情報があるので、処理をされるために順番待ちをしているのです。

そこで、順番を待っているイベントがあるかどうかを認識したり、 用済みのイベントを消して、次のイベントを呼ぶのがこの関数です。

SDL_Event ev;
SDL_PollEvent(&ev)

イベント構造体のevのアドレスを参照して、判断させるため、&を使います。 このとき、実際の処理は、イベント構造体の中にイベントがあれば、 今のイベントを消去して次のイベントを読み込み、tureを返す。 イベントが無ければ、falseを返す。

最初は空。
イベント1、イベント2、イベント3、イベント4・・・・
SDL_Event構造体のev順番待ちをしてるイベント

↓イベントがあるので、イベント1のみ読み込まれる。値はture

イベント1
イベント2、イベント3、イベント4・・・・

↓イベント1が消去され、イベント2が読み込まれる。

イベント2
イベント3、イベント4、イベント5・・・・

↓最後まで行くと・・・

待機イベントなし。

イベントが全てなくなったので、falseを返す。


このように、待機中のイベントを全て処理しないことには、目的のイベントがあるかどうかわからないため、 普通はwhile文でこの関数を使います。

#include <stdio.h> #include "SDL/SDL.h" #pragma comment(lib, "SDL.lib") #pragma comment(lib, "SDLmain.lib") bool Event(void); //boolはtureかfalseのみ扱う定義 int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption("SAMPLEファイル",NULL); SDL_Surface *screen; screen = SDL_SetVideoMode( 640 , 480 , 32 , SDL_SWSURFACE ); while(1) //プログラムを起動し続けるためにループを作る。 { if(!Event()) break; //もしイベントがあれば、ループを抜ける。 } SDL_Quit(); return 0; } bool Event() //イベント監視用の関数を作る。 { SDL_Event ev; while(SDL_PollEvent(&ev)) //イベントがある限り続ける { if(ev.type == SDL_KEYDOWN) //キーが押されたかどうかの確認。 { printf("キーが押されました"); return false; //falseを返す。 break; } } return ture; //イベントがなければtureを返す。 }

これで、ようやく前回のev.typeが目的のKEYDOWNにたどり着けるようになりました。
次回は、SDL_Eventの.typeの種類を少し紹介します。

〜〜第七話へ〜〜