SDL庫的學習筆記之二—初始化、退出
參考資料
SDL wiki
發現其實我只是翻譯一下Orz
初始化與退出函式
原型
int SDL_Init(Uint32 flags)
int SDL_InitSubSystem(Uint32 flags)
Uint32 SDL_WasInit(Uint32 flags)
void SDL_QuitSubSystem(Uint32 flags)
void SDL_Quit(void)
引數
引數 | 用途 |
---|---|
flags | subsystem initialization flags |
SDL庫由多個子系統構成,在使用子系統之前,必須先進行初始化
不同的flag代表著不同的子系統,已經定義的如下
flags | details |
---|---|
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 | 這個flag被忽略了 |
如果要同時初始化多個子系統的話,或一下就可以了
譬如這樣 SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO )
注意中間的“|”
返回值
int SDL_Init(Uint32 flags) 與 int SDL_InitSubSystem(Uint32 flags)
返回0表示成功,如果不是零,那就是負數,代表錯誤碼,呼叫 SDL_GetError()函式可以輸出錯誤資訊
Uint32 SDL_WasInit(Uint32 flags)
如果flag是0的話,這個函式將會返回所有已經初始化的子系統
如果不是0而是子系統的flag,就會返回對應的狀態
所以返回值是Uint32型別的
可以像下面這樣子呼叫
if (SDL_WasInit(SDL_INIT_VIDEO) != 0) {
printf("Video is initialized.\n");
} else {
printf("Video is not initialized.\n");
}
Uint32 subsystem_mask = SDL_INIT_VIDEO | SDL_INIT_AUDIO;
if (SDL_WasInit(subsystem_mask) == subsystem_mask) {
printf("Video and Audio initialized.\n");
} else {
printf("Video and Audio not initialized.\n");
}
還有一些內容
呼叫了SDL_Init初始化了一些子系統,如果還想要另外再初始一些子系統,用SDL_InitSubSystem就可以了
不過注意有這麼一句
*
you must call SDL_QuitSubSystem() for each SDL_InitSubSystem() to
correctly shutdown a subsystem manually (or call SDL_Quit() to force
shutdown).
*
也就是說,關閉呼叫的子系統要用SDL_QuitSubSystem(),因為SDL_QuitSubSystem()是有引數的,可以關閉特定的子系統,如果用了SDL_Quit()的話,那麼就關掉了所有的子系統……
在SDL_Quit()下有這麼一句註釋
You should call this function even if you have already shutdown each initialized subsystem with SDL_QuitSubSystem(). It is safe to call this function even in the case of errors in initialization.
也就是說,即使你用SDL_QuitSubSystem()關閉了所有的子系統,在退出程式之前也是要呼叫SDL_Quit()的……
wiki上面的例程是一個很不錯的呼叫方式,很容易理解我也就不多說了……
#include "SDL.h"
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) != 0) {
SDL_Log("Unable to initialize SDL: %s\n", SDL_GetError());
return 1;
}
/* ... */
SDL_Quit();
return 0;
}
在結束程式之前,需要SDL_Quit()一下,即使初始化出錯了,也是比較安全的
不過,還記得我們上一篇的例程嗎
裡面的呼叫方式不太一樣
if (SDL_VideoInit(NULL) == -1) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Could not initialize SDL video.");
exit(-2);
}