SDLを使うためには, 他のほとんどの関数の前にSDL_Init()を呼ぶ必要がある. SDL_Init()の役割は, SDLライブラリを正常に初期化し, 要求に応じて個別のサブシステムを開始することである.
イベントハンドル, ファイルI/O, そしてスレッドサブシステムはデフォルトで初期化される.
他のサブシステムを使うときは個別に指定して初期化しなければならない.
論理和で複数のサブシステムを指定できる.
例: SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
デフォルトの3つに加え, ビデオとオーディオのサブシステムを初期化する.
いくつかのOSでは, SDL_Init()はSDL_main()が定義されていなければ失敗する. あらかじめSDL_SetMainReady()を呼べば, この失敗を回避できる. しかし, 不正な初期化はプログラムをクラッシュさせ, 調査を難しくするため, ユーザがSDL_SetMainReady()を呼ぶときは注意する必要がある.
デフォルトの3つを含むサブシステムを安全に終了させるために, SDLアプリケーションが終了する前にSDL_Quit()を呼ぶ必要がある.
SDL_Quit()を使う場合は, 自動的に全てのサブシステムを終了するため, 個別に指定する必要はない.
int SDL_Init(Uint32 flags)
flags | サブシステム初期化フラグ |
イベントハンドル, ファイルI/O, そしてスレッドサブシステムはデフォルトで初期化される. 他のサブシステムを使うときは指定して初期化しなければならない.
flagsは以下の項目の論理和で複数設定できる:
SDL_INIT_TIMER | タイマ サブシステム |
SDL_INIT_AUDIO | オーディオ サブシステム |
SDL_INIT_VIDEO | ビデオ サブシステム |
SDL_INIT_JOYSTICK | ジョイスティック サブシステム |
SDL_INIT_HAPTIC | ハプティクス(感覚フィードバック) サブシステム |
SDL_INIT_GAMECONTROLLER | コントローラー サブシステム |
SDL_INIT_EVENTS | イベント サブシステム |
SDL_INIT_EVERYTHING | 上記のサブシステムの全て |
SDL_INIT_NOPARACHUTE | fatal signalをキャッチしない |
SDL_INIT_NOPARACHUTEを指定しない限り, (SIGSEGVのような)いくつかのfatal signalのためのクリーンアップシグナルハンドラが設定される.
個別にサブシステムを初期化したい場合は, SDL_Init(0)を呼び, 後で必要なflagsを指定してSDL_InitSubSystem()を呼ぶとよい.
int SDL_InitSubSystem(Uint32 flags)
flags | SDL_Init()と同じ |
SDL_Init()で初期化した後でもSDL_InitSubSystem()で未初期化のサブシステムを初期化することができる.
SDL_Init()はアサーションとクラッシュプロテクションを初期化し, その後SDL_InitSubSystem()を呼んでいる. それらのプロテクションを回避したい場合は直接SDL_InitSubSystem()を呼ぶとよい.
void SDL_Quit(void)
SDL_QuitSubSystem()で既に個別にサブシステムを終了した場合でもこの関数を呼ばなければならない.
SDL_Init()やSDL_InitSubSystem()の代わりにSDL_VideoInit()等のサブシステム初期化関数を呼んでサブシステムを開始した場合は, SDL_Quit()を呼ぶ前にSDL_VideoQuit()等のサブシステム終了関数を呼ぶ必要がある.
この関数はatexit()でアプリケーションが終了するときに必ず呼ばれるようにすることができる. しかしライブラリや他の動的に読み込まれるコードでそのようにするのはよい方法ではない.
void SDL_QuitSubSystem(Uint32 flags)
flags | SDL_Init()と同じ |
SDL_Init()やSDL_InitSubSystem()の代わりにSDL_VideoInit()等のサブシステム初期化関数を読んでサブシステムを開始した場合, SDL_QuitSubSystem()とSDL_WasInit()は使えない. その場合はSDL_VideoQuit()等のサブシステム終了関数を直接呼ぶ必要がある.
全てのサブシステムをSDL_QuitSubSystem()で終了した場合でもSDL_Quit()を呼ぶ必要がある.
void SDL_SetMainReady(void)
この関数はSDL_main.hで定義されていて, プリプロセッサがmain()をSDL_main()で再定義するときに使用される. main()関数を再定義されないようにするためには, SDL.hをインクルードする前にSDL_MAIN_HANDLEDを定義する必要がある
Uint32 SDL_WasInit(Uint32 flags)
flags | SDL_Init()と同じ |
flagsが0のとき全ての初期化されたサブシステムのマスクを戻す. その他のとき個別のサブシステムの状態を戻す.
戻り値にはSDL_INIT_NOPARACHUTEは含まれない.