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

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-12-19 09:45:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
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);
它将清除所有错误信息。这用于清除掉你已经处理过的错误信息——否则即使没有异常,你仍然可能收到上次异常的错误信息。

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表