目次 - API(機能別) - イベント処理 - SDL_Event

# SDL_Event

異なる種類のイベントの情報を持つ共用体

## フィールド

Uint32 | type | イベントの種類, このフィールドは全種類のイベントで共用している
SDL_CommonEvent | common | 共通イベントの情報
SDL_WindowEvent | window | ウィンドウイベントの情報
SDL_KeyboardEvent | key | キーボードイベントの情報
SDL_TextEditingEvent | edit | テキスト編集イベントの情報
SDL_TextInputEvent | text | テキスト入力イベントの情報
SDL_MouseMotionEvent | motion | マウス移動イベントの情報
SDL_MouseButtonEvent | button | マウスボタンイベントの情報
SDL_MouseWheelEvent | wheel | マウスホイールイベントの情報
SDL_JoyAxisEvent | jaxis | ジョイスティック軸イベントの情報
SDL_JoyBallEvent | jball | ジョイスティックボールイベントの情報
SDL_JoyHatEvent | jhat | ジョイスティックハットイベントの情報
SDL_JoyButtonEvent | jbutton | ジョイスティックボタンイベントの情報
SDL_JoyDeviceEvent | jdevice | ジョイスティック接続イベントの情報
SDL_ControllerAxisEvent | caxis | ゲームコントローラー軸イベントの情報
SDL_ControllerButtonEvent | cbutton | ゲームコントローラーボタンイベントの情報
SDL_ControllerDeviceEvent | cdevice | ゲームコントローラー接続イベントの情報
SDL_AudioDeviceEvent | adevice | オーディオデバイスイベントの情報 (SDL 2.0.4以降)
SDL_QuitEvent | quit | 終了要求イベントの情報
SDL_UserEvent | user | アプリケーション定義イベントの情報
SDL_SysWMEvent | syswm | システム依存ウィンドウイベントの情報
SDL_TouchFingerEvent | tfinger | タッチイベントの情報
SDL_MultiGestureEvent | mgesture | マルチタッチジェスチャーイベントの情報
SDL_DollarGestureEvent | dgesture | 複雑なジェスチャーイベントの情報
SDL_DropEvent | drop | ドラッグ&ドロップイベントの情報

## 詳細

SDL_Eventは全てのSDLイベント処理の中核で, SDLで使われる全てのイベント構造体の共用体である. どのイベントがどの共用体のメンバに対応しているかを知るのは簡単である. 後の表にその関係がある.

SDL_Eventには2つの使い方がある

- キューからイベントを読み込む
- キューにイベントを書き込む

### キューからイベントを読み込む

SDL_PollEvent()またはSDL_PeepEvents()でキューからイベントを得られる. SDL_PollEvent()を例に説明する.

まず始めに, 空のSDL_Eventを生成する.

`SDL_Event test_event;`

SDL_PollEvent()はイベントを読み込み, キューから削除する. もしキューにイベントがなければ0を, あれば1を戻す. whileループを使い, 全てのイベントを処理する.

``

    while (SDL_PollEvent(&test_event)) {

SDL_PollEvent()は引数のSDL_Eventへのポインタにイベント情報を代入する. SDL_PollEvent()はイベントをキューから取り除き, その後test_eventに書き込む. しかし, test_eventのtypeメンバにはイベントの種類も書き込まれている. よって, 種類に応じてイベントを処理するためにはswitch文を使う.

`switch (test_event.type) {`

得られたイベントが何であるか, そしてそのイベントの種類は何であるかを知る必要がある. ここでは, アプリケーションでユーザがマウスを動かしたことを検知したいと想定する. イベント種類を見渡すと, SDL_MOUSEMOTIONに気がつく. これが探しているイベントだろう. 後の表を見ると, SDL_MOUSEMOTIONイベントはSDL_EventのメンバのSDL_MouseMotionEventで処理することが分かる. SDL_MOUSEMOTIONのイベントの種類はswitch文の内部で次のようにチェックできる.

``

    	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");

### キューにイベントを書き込む

キューにイベントを入れることも可能で, 2つの方法がある. SDL_PushEvent()またはSDL_PushEvent()でキューにイベントを入れることができる. 通常, これは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);

### イベントの種類と共用体のメンバの関係

イベントの種類(typeメンバ) | イベント構造体 | SDL_Eventフィールド
--- | --- | ---
SDL_AUDIODEVICEADDED SDL_AUDIODEVICEREMOVED | SDL_AudioDeviceEvent | adevice
SDL_CONTROLLERAXISMOTION | SDL_ControllerAxisEvent | caxis
SDL_CONTROLLERBUTTONDOWN SDL_CONTROLLERBUTTONUP | SDL_ControllerButtonEvent | cbutton
SDL_CONTROLLERDEVICEADDED SDL_CONTROLLERDEVICEREMOVED SDL_CONTROLLERDEVICEREMAPPED | SDL_ControllerDeviceEvent | cdevice
SDL_DOLLARGESTURE SDL_DOLLARRECORD | SDL_DollarGestureEvent | dgesture
SDL_DROPFILE SDL_DROPTEXT SDL_DROPBEGIN SDL_DROPCOMPLETE | SDL_DropEvent | drop
SDL_FINGERMOTION SDL_FINGERDOWN SDL_FINGERUP | SDL_TouchFingerEvent | tfinger
SDL_KEYDOWN SDL_KEYUP | SDL_KeyboardEvent | key
SDL_JOYAXISMOTION | SDL_JoyAxisEvent | jaxis
SDL_JOYBALLMOTION | SDL_JoyBallEvent | jball
SDL_JOYHATMOTION | SDL_JoyHatEvent | jhat
SDL_JOYBUTTONDOWN SDL_JOYBUTTONUP | SDL_JoyButtonEvent | jbutton
SDL_JOYDEVICEADDED SDL_JOYDEVICEREMOVED | SDL_JoyDeviceEvent | jdevice
SDL_MOUSEMOTION | SDL_MouseMotionEvent | motion
SDL_MOUSEBUTTONDOWN SDL_MOUSEBUTTONUP | SDL_MouseButtonEvent | button
SDL_MOUSEWHEEL | SDL_MouseWheelEvent | wheel
SDL_MULTIGESTURE | SDL_MultiGestureEvent | mgesture
SDL_QUIT | SDL_QuitEvent | quit
SDL_SYSWMEVENT | SDL_SysWMEvent | syswm
SDL_TEXTEDITING | SDL_TextEditingEvent | edit
SDL_TEXTINPUT | SDL_TextInputEvent | text
SDL_USEREVENT | SDL_UserEvent | user
SDL_WINDOWEVENT | SDL_WindowEvent | window
その他のイベント | SDL_CommonEvent | なし. typeフィールドを使うこと

## 関連項目(列挙体)

SDL_EventType

## 関連項目(構造体)

SDL_AudioDeviceEvent
SDL_ControllerAxisEvent
SDL_ControllerButtonEvent
SDL_ControllerDeviceEvent
SDL_DollarGestureEvent
SDL_DropEvent
SDL_JoyAxisEvent
SDL_JoyBallEvent
SDL_JoyButtonEvent
SDL_JoyDeviceEvent
SDL_JoyHatEvent
SDL_KeyboardEvent
SDL_MouseButtonEvent
SDL_MouseMotionEvent
SDL_MouseWheelEvent
SDL_MultiGestureEvent
SDL_QuitEvent
SDL_SysWMEvent
SDL_TextEditingEvent
SDL_TextInputEvent
SDL_TouchFingerEvent
SDL_UserEvent
SDL_WindowEvent

## 関連項目(関数)

SDL_PeepEvents
SDL_PollEvent
SDL_PushEvent
SDL_WaitEvent
SDL_WaitEventTimeout

## SDL Wikiへのリンク

SDL_Event - SDL Wiki