论坛首页
我爱代码论坛
腾讯课堂
视频课程
VIP会员
代码豆
作弊
反作弊
签到与任务
论坛任务
更多
立即注册
登录
登录
后可以保存 扩展风格
炉石传说
请
登录
后使用快捷导航
没有帐号?
立即注册
每日签到
《我爱代码 - 专业游戏安全与逆向论坛》
我爱代码 - 专业游戏安全与逆向论坛
»
论坛首页
›
C++游戏编程
›
C/C++
›
SDL入门教程(二):3、中途装载与退出,SDL错误信息 ...
SDL入门教程(二):3、中途装载与退出,SDL错误信息
[复制链接]
C/C++
woaidaima2016
当前离线
积分
9139
woaidaima2016
该用户从未签到
2380
主题
2433
帖子
9139
积分
管理员
积分
9139
发消息
电梯直达
楼主
发表于 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好友和群
收藏
0
回复
使用道具
举报
快速回复
选择回复内容
我爱代码论坛真是个好地方!
楼主发帖辛苦了,谢谢我爱代码论坛楼主分享!
学习就来我爱代码,这里资源真不错!
既然我爱代码论坛推荐了,那我就回复了!
这东西不错,谢谢我爱代码论坛楼主!
这帖子不回对不起自己!
我看不错哦,谢谢我爱代码论坛楼主!
其实我一直觉得楼主品味不错!呵呵!
感谢咯住无私分享!我爱代码论坛真是个学习的好地方!
我爱代码论坛双击一波666!你是铁头娃,真皮沙发!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
快速回复
返回顶部
返回列表