SDL入门教程(二):3、中途装载与退出,SDL错误信息

作者:龙飞

3.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);


3.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.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 );

它将清除所有错误信息。这用于清除掉你已经处理过的错误信息——否则即使没有异常,你仍然可能收到上次异常的错误信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值