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 )
注意中间的“|”
返回0表示成功,如果不是零,那就是负数,代表错误码,调用 SDL_GetError()函数可以输出错误信息
如果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)