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


今回はイベントについて、ほんの少しだけ詳しい内容を書いていきます。

まず、前々回出てきた、SDL_Event構造体の.typeですが、
ここには、「何の種類のイベントか?」という情報が入ります。

.typeに代入できるマクロの名前イベントの種類
SDL_ACTIVEEVENTウィンドウのアクティブに関するイベント
SDL_KEYDOWNキーボードのボタンが押されたとき
SDL_KEYUPキーが離れたとき
SDL_MOUSEMOTIONマウスが動いたとき
SDL_MOUSEBUTTONDOWNマウスのボタンが押されたとき
SDL_MOUSEBUTTONUPマウスのボタンが離れたとき
SDL_JOYAXISMOTIONジョイスティックの軸が動いたとき
SDL_JOYBALLMOTIONジョイスティックのボールが動いたとき
SDL_JOYHATMOTIONジョイスティックのハットスイッチが変化したとき
SDL_JOYBUTTONDOWNジョイスティックのボタンが押されたとき
SDL_JOYBUTTONUPジョイスティックのボタンが離れたとき
SDL_QUITプログラムが終了するとき(ウィンドウの閉じるボタンが押されたときなど)
SDL_SYSWMEVENT未調査(カット&ペーストするとき使う)
SDL_VIDEORESIZEウィンドウがリサイズされたとき
SDL_VIDEOEXPOSE未調査(再描画する必要性があるとき)
SDL_USEREVENTユーザー定義のイベント



そして今回はもう一つ紹介します。
キーボードが押されたイベント(SDL_Event ev.typeがSDL_KEYDOWNのとき)で
どのキーが押されたのかを取得する方法。

SDL_Event ev;
SDLKey *key;
key=&(ev.key.keysym.sym);


少し複雑ですが、上では*keyに、押されたキーボードのASCII番号が入りました。
SDLKey とは、キーの情報を入れる変数型の定義です。
ev.key.keysym.symは、ずいぶんメンバが連続してますが、これは、

イベント構造体の、キーに関する構造体の、キーの内容に関する構造体の、キーの種類の値が入ってる変数。

ここは、複雑なところを考えず、
「イベント構造体の中の、.key.keysym.symがキーの値」
と覚えておけば良いと思います。


とりあえずこれで、最低限必要な知識がそろったと思います。ソースに加えてみましょう。

#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) //キーが押されたかどうかの確認。 { SDLKey *key; key=&(ev.key.keysym.sym); if(*key == 27) //ESCボタンが27です。 { printf("ESCボタンが押されました。"); return false; break; //ループを抜ける。 } } if(ev.type == SDL_QUIT) //終了ボタンが押されたときなど。 { return false; break; } } return ture; //イベントがなければtureを返す。 }



次回は、ソースの並び方を考え、効率がよく、わかりやすいプログラムにしていきます。

〜〜第七と二分の一話へ〜〜