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

下面有一些系统可以用专门的函数来初始化,似乎可以初始化特定的设备,但是有更多需要注意的地方,这里就不展开讲解了(个人水平不足Orz)……
int SDL_VideoInit(const char* driver_name)
int SDL_AudioInit(const char* driver_name)

你可能感兴趣的:(SDL库的学习笔记之二—初始化、退出)