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

SDL_Event

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

フィールド

Uint32typeイベントの種類, このフィールドは全種類のイベントで共用している
SDL_CommonEventcommon共通イベントの情報
SDL_WindowEventwindowウィンドウイベントの情報
SDL_KeyboardEventkeyキーボードイベントの情報
SDL_TextEditingEventeditテキスト編集イベントの情報
SDL_TextInputEventtextテキスト入力イベントの情報
SDL_MouseMotionEventmotionマウス移動イベントの情報
SDL_MouseButtonEventbuttonマウスボタンイベントの情報
SDL_MouseWheelEventwheelマウスホイールイベントの情報
SDL_JoyAxisEventjaxisジョイスティック軸イベントの情報
SDL_JoyBallEventjballジョイスティックボールイベントの情報
SDL_JoyHatEventjhatジョイスティックハットイベントの情報
SDL_JoyButtonEventjbuttonジョイスティックボタンイベントの情報
SDL_JoyDeviceEventjdeviceジョイスティック接続イベントの情報
SDL_ControllerAxisEventcaxisゲームコントローラー軸イベントの情報
SDL_ControllerButtonEventcbuttonゲームコントローラーボタンイベントの情報
SDL_ControllerDeviceEventcdeviceゲームコントローラー接続イベントの情報
SDL_AudioDeviceEventadeviceオーディオデバイスイベントの情報 (SDL 2.0.4以降)
SDL_QuitEventquit終了要求イベントの情報
SDL_UserEventuserアプリケーション定義イベントの情報
SDL_SysWMEventsyswmシステム依存ウィンドウイベントの情報
SDL_TouchFingerEventtfingerタッチイベントの情報
SDL_MultiGestureEventmgestureマルチタッチジェスチャーイベントの情報
SDL_DollarGestureEventdgesture複雑なジェスチャーイベントの情報
SDL_DropEventdropドラッグ&ドロップイベントの情報

詳細

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_AudioDeviceEventadevice
SDL_CONTROLLERAXISMOTIONSDL_ControllerAxisEventcaxis
SDL_CONTROLLERBUTTONDOWN
SDL_CONTROLLERBUTTONUP
SDL_ControllerButtonEventcbutton
SDL_CONTROLLERDEVICEADDED
SDL_CONTROLLERDEVICEREMOVED
SDL_CONTROLLERDEVICEREMAPPED
SDL_ControllerDeviceEventcdevice
SDL_DOLLARGESTURE
SDL_DOLLARRECORD
SDL_DollarGestureEventdgesture
SDL_DROPFILE
SDL_DROPTEXT
SDL_DROPBEGIN
SDL_DROPCOMPLETE
SDL_DropEventdrop
SDL_FINGERMOTION
SDL_FINGERDOWN
SDL_FINGERUP
SDL_TouchFingerEventtfinger
SDL_KEYDOWN
SDL_KEYUP
SDL_KeyboardEventkey
SDL_JOYAXISMOTIONSDL_JoyAxisEventjaxis
SDL_JOYBALLMOTIONSDL_JoyBallEventjball
SDL_JOYHATMOTIONSDL_JoyHatEventjhat
SDL_JOYBUTTONDOWN
SDL_JOYBUTTONUP
SDL_JoyButtonEventjbutton
SDL_JOYDEVICEADDED
SDL_JOYDEVICEREMOVED
SDL_JoyDeviceEventjdevice
SDL_MOUSEMOTIONSDL_MouseMotionEventmotion
SDL_MOUSEBUTTONDOWN
SDL_MOUSEBUTTONUP
SDL_MouseButtonEventbutton
SDL_MOUSEWHEELSDL_MouseWheelEventwheel
SDL_MULTIGESTURESDL_MultiGestureEventmgesture
SDL_QUITSDL_QuitEventquit
SDL_SYSWMEVENTSDL_SysWMEventsyswm
SDL_TEXTEDITINGSDL_TextEditingEventedit
SDL_TEXTINPUTSDL_TextInputEventtext
SDL_USEREVENTSDL_UserEventuser
SDL_WINDOWEVENTSDL_WindowEventwindow
その他のイベント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