SDL_Event

Name

SDL_Event -- 総合的なイベント構造体

Structure Definition

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;

Structure Data

typeイベントの種類
activeアクティベーションに関するイベント
keyキーボードイベント
motionマウスの移動に関するイベント
buttonマウスのボタンに関するイベント
jaxisジョイスティックの移動に関するイベント
jballジョイスティックのトラックボールの移動に関するイベント
jhatジョイスティックの十字キーに関するイベント
jbuttonジョイスティックのボタンに関するイベント
resizeウインドウのリサイズに関するイベント
exposeアプリケーションのエクスポーズに関するイベント
quitアプリケーションの終了要求に関するイベント
userユーザ定義のイベント
syswmウインドウマネージャに関するイベント

Description

SDL_Eventは、 SDLのイベントハンドリングの中心となる共用体です。おそらく SDL_Surfaceに次いで重要なものでしょう。 SDL_Eventは、SDLで扱うすべてのイベント構造体の 共用体になっており、 typeフィールドによりイベントの種類を 知ることができます。

イベントの種類(type)構造体
SDL_ACTIVEEVENTSDL_ActiveEvent
SDL_KEYDOWN/UPSDL_KeyboardEvent
SDL_MOUSEMOTIONSDL_MouseMotionEvent
SDL_MOUSEBUTTONDOWN/UPSDL_MouseButtonEvent
SDL_JOYAXISMOTIONSDL_JoyAxisEvent
SDL_JOYBALLMOTIONSDL_JoyBallEvent
SDL_JOYHATMOTIONSDL_JoyHatEvent
SDL_JOYBUTTONDOWN/UPSDL_JoyButtonEvent
SDL_QUITSDL_QuitEvent
SDL_SYSWMEVENTSDL_SysWMEvent
SDL_VIDEORESIZESDL_ResizeEvent
SDL_VIDEOEXPOSESDL_ExposeEvent
SDL_USEREVENTSDL_UserEvent

Use

SDL_Event 構造体には以下の2つの用途があります。

キューからイベントを読み出すには、 SDL_PollEventSDL_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_PushEventSDL_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);

See Also

SDL_PollEvent, SDL_PushEvent, SDL_PeepEvents