[转]中途装载与退出,SDL错误信息 SDL_InitSubSystem SDL_QuitSubSystem
参考:http://www.cppblog.com/lf426/archive/2008/02/02/42412.html 作者:龙飞 这次又是完全拷贝,别喷我
1:SDL flags 的中途装载和中途退出。
如果我们在程序一开始只启动了video,在运行的某个期间需要启动audio,之后,又需要关掉video只保持audio听声音应该怎么做呢?
先说中途装载。我们首先想到的,还是通过SDL_Init();来装载audio。这看似合理的,而且通过本人试验,发现事实上也是可行的。但是,我们前面分析过一个逻辑,就是一个程序最好只装载一次Init,这样更容易看出来SDL是从什么时候开始工作的。那么,为了表明之后的装载是在SDL某些flags已经装载之后的中途装载,SDL提供了一个基本上类似的函数:
int SDL_InitSubSystem(Uint32 flags);
与Init一样,返回值为0则成功装载,-1则失败。
中途退出某些flags的问题,我们显然就不能用SDL_Quit();了,因为这是所有flags全退。SDL提供了中途退出某些flags的函数:
void SDL_QuitSubSystem(Uint32 flags);
2:一段用于演示SDL中途装载和中途退出某些flags的程序。
/////////////////////// //SDL中途装载和中途退出的演示程序 //联系我: znln426@163.com //再别流年的技术实验室 //http://www.cppblog.com/lf426/ /////////////////// #include <iostream> #include <iomanip> #include "SDL/SDL.h" using namespace std; void showHex(int SDLflags); void showBool(); int main(int argc, char* argv[]) { cout << "*****flags*****" << endl; cout << "SDL_INIT_EVERYTHING = "; showHex(SDL_INIT_EVERYTHING); cout << "SDL_INIT_VIDEO = "; showHex(SDL_INIT_VIDEO); cout << "SDL_INIT_AUDIO = "; showHex(SDL_INIT_AUDIO); cout << "SDL_INIT_TIMER = "; showHex(SDL_INIT_TIMER); cout << "SDL_INIT_CDROM = "; showHex(SDL_INIT_CDROM); cout << "SDL_INIT_JOYSTICK = "; showHex(SDL_INIT_JOYSTICK); cout << endl << endl; cout << "*****runtime*****\n\n"; SDL_Init(SDL_INIT_VIDEO); cout << "SDL_Init(SDL_INIT_VIDEO) calling" <<endl; showBool(); SDL_InitSubSystem(SDL_INIT_AUDIO); cout << "SDL_InitSubSystem(SDL_INIT_AUDIO) calling" <<endl; showBool(); SDL_QuitSubSystem(SDL_INIT_VIDEO); cout << "SDL_QuitSubSystem(SDL_INIT_VIDEO) calling" <<endl; showBool(); SDL_Quit(); cout << "SDL_Quit() calling" <<endl; showBool(); return 0; } void showBool() { cout << "*****runtime in bool*****" << endl; cout << boolalpha; Uint32 runtimeThing = SDL_WasInit(SDL_INIT_EVERYTHING); cout << "SDL_WasInit(SDL_INIT_EVERYTHING) = "; showHex(runtimeThing); cout << "SDL_INIT_VIDEO? " << bool(runtimeThing & SDL_INIT_VIDEO) << endl; cout << "SDL_INIT_AUDIO? " << bool(runtimeThing & SDL_INIT_AUDIO) << endl; cout << noboolalpha; cout << "\n\n"; } void showHex(int SDLflags) { cout << hex; cout << "0x" << setw(8) << setfill('0') << SDLflags << endl; cout << dec; }
演示程序的执行结果:
*****flags***** SDL_INIT_EVERYTHING = 0x0000ffff SDL_INIT_VIDEO = 0x00000020 SDL_INIT_AUDIO = 0x00000010 SDL_INIT_TIMER = 0x00000001 SDL_INIT_CDROM = 0x00000100 SDL_INIT_JOYSTICK = 0x00000200 *****runtime***** SDL_Init(SDL_INIT_VIDEO) calling *****runtime in bool***** SDL_WasInit(SDL_INIT_EVERYTHING) = 0x00000020 SDL_INIT_VIDEO? true SDL_INIT_AUDIO? false SDL_InitSubSystem(SDL_INIT_AUDIO) calling *****runtime in bool***** SDL_WasInit(SDL_INIT_EVERYTHING) = 0x00000030 SDL_INIT_VIDEO? true SDL_INIT_AUDIO? true SDL_QuitSubSystem(SDL_INIT_VIDEO) calling *****runtime in bool***** SDL_WasInit(SDL_INIT_EVERYTHING) = 0x00000010 SDL_INIT_VIDEO? false SDL_INIT_AUDIO? true SDL_Quit() calling *****runtime in bool***** SDL_WasInit(SDL_INIT_EVERYTHING) = 0x00000000 SDL_INIT_VIDEO? false SDL_INIT_AUDIO? false
3:SDL的错误信息。
在前面的例子中,我们自己提供了出现异常的错误信息,实际上,SDL也提供了自己的错误信息返回函数:
char *SDL_GetError(void);
在官方文档中提供的示范例子是C风格的表述:
if (SDL_Init(SDL_INIT_EVERYTHING) == -1) { printf("SDL_Init Failed: %s\n", SDL_GetError()); // Unrecoverable error, exit here. }
值得注意的是,这个函数的返回值是C风格字符串char* ,当我们使用C++风格的异常处理的时候,如果
throw SDL_GetError();
那么,应该catch一个char*对象
catch ( const char* s ) {}
当我们并不是很熟悉SDL内置的错误信息的时候,自己写异常信息是更值得推荐的选择。
最后介绍的函数是:
void SDL_ClearError(void);
它将清除所有错误信息。这用于清除掉你已经处理过的错误信息——否则即使没有异常,你仍然可能收到上次异常的错误信息。