typedef union{
Uint8 type;
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
SDL_MouseMotionEvent motion;
SDL_MouseButtonEvent button;
SDL_JoyAxisEvent jaxis;
SDL_JoyBallEvent jball;
SDL_JoyHatEvent jhat;
SDL_JoyButtonEvent jbutton;
SDL_ResizeEvent resize;
SDL_ExposeEvent expose;
SDL_QuitEvent quit;
SDL_UserEvent user;
SDL_SywWMEvent syswm;
} SDL_Event;| type | イベントの種類 |
| active | アクティベーションに関するイベント |
| key | キーボードイベント |
| motion | マウスの移動に関するイベント |
| button | マウスのボタンに関するイベント |
| jaxis | ジョイスティックの移動に関するイベント |
| jball | ジョイスティックのトラックボールの移動に関するイベント |
| jhat | ジョイスティックの十字キーに関するイベント |
| jbutton | ジョイスティックのボタンに関するイベント |
| resize | ウインドウのリサイズに関するイベント |
| expose | アプリケーションのエクスポーズに関するイベント |
| quit | アプリケーションの終了要求に関するイベント |
| user | ユーザ定義のイベント |
| syswm | ウインドウマネージャに関するイベント |
SDL_Eventは、 SDLのイベントハンドリングの中心となる共用体です。おそらく SDL_Surfaceに次いで重要なものでしょう。 SDL_Eventは、SDLで扱うすべてのイベント構造体の 共用体になっており、 typeフィールドによりイベントの種類を 知ることができます。
| イベントの種類(type) | 構造体 |
|---|---|
| SDL_ACTIVEEVENT | SDL_ActiveEvent |
| SDL_KEYDOWN/UP | SDL_KeyboardEvent |
| SDL_MOUSEMOTION | SDL_MouseMotionEvent |
| SDL_MOUSEBUTTONDOWN/UP | SDL_MouseButtonEvent |
| SDL_JOYAXISMOTION | SDL_JoyAxisEvent |
| SDL_JOYBALLMOTION | SDL_JoyBallEvent |
| SDL_JOYHATMOTION | SDL_JoyHatEvent |
| SDL_JOYBUTTONDOWN/UP | SDL_JoyButtonEvent |
| SDL_QUIT | SDL_QuitEvent |
| SDL_SYSWMEVENT | SDL_SysWMEvent |
| SDL_VIDEORESIZE | SDL_ResizeEvent |
| SDL_VIDEOEXPOSE | SDL_ExposeEvent |
| SDL_USEREVENT | SDL_UserEvent |
SDL_Event 構造体には以下の2つの用途があります。
キューからイベントを読み出す
キューにイベントを登録する
キューからイベントを読み出すには、 SDL_PollEvent か SDL_PeepEventsを使います。 ここでは、SDL_PollEventを使った例を示します。
最初に空のSDL_Event構造体を作成します。
SDL_Event test_event;SDL_PollEventは、イベントキューから次のイベントを 取り出して、キューから削除します。 キューにイベントがないときは0を返し、 それ以外のときは1を返します。 whileループを使ってイベントを1つずつ取り出してゆきます。
while(SDL_PollEvent(&test_event)) {
SDL_PollEvent関数は、イベント情報を得るための
SDL_Event構造体へのポインタを渡します。
SDL_PollEventがキューからイベントを取り出すと、
そのイベントの情報は引数に指定したtest_event 構造体に格納されています。また、イベントの種類が
test_event構造体のtype
フィールドに格納されています。
そのため、イベントのtypeを判別するために
switch 文を使います。
switch(test_event.type) {
次に、どの種類のイベントを知りたいのかということと、起こった
イベントのtypeを知らなければいけません。
ここでは、アプリケーション内のマウスポインタの動きを知りたいとします。
求めているイベントは SDL_MOUSEMOTIONであることが
分かります。
さらに 調べてみると、
SDL_MOUSEMOTIONイベントが、
SDL_Event共用体のメンバである
SDL_MouseMotionEvent構造体motionを扱っていることが
分かるでしょう。
switch文でtypeを
調べることで、
SDL_MOUSEMOTIONイベントを選別することができます。
case SDL_MOUSEMOTION:ここではtest_event構造体の motionメンバから情報を得ることができます。
printf("マウスカーソルが移動するイベントを受信しました。\n");
printf("カーソルの位置は(%d, %d)です。\n", test_event.motion.x, test_event.motion.y);
break;
default:
printf("ハンドルしていないイベントです!\n");
break;
}
}
printf("イベントキューは空です。\n");イベントキューにイベントを送ることができますので、 イベントキューを双方向通信に利用することもできます。 SDL_PushEvent とSDL_PeepEventsは どちらもイベントキューにイベントを送ることができます。 通常、 SDL_USEREVENT イベントを登録するために 利用しますが、偽の入力イベントを作り出したりするために使うこともできます。 独自のイベントを作るために必要なことは、イベントのタイプを選んでtypeに格納し、 メンバ構造体に適切な情報格納するだけです。
SDL_Event user_event; user_event.type=SDL_USEREVENT; user_event.user.code=2; user_event.user.data1=NULL; user_event.user.data2=NULL; SDL_PushEvent(&user_event);