1. 程式人生 > >SDL庫的學習筆記之二—初始化、退出

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