希望和广大热爱技术的童鞋一起交流,成长。
分类: Windows平台
2015-04-15 16:36:42
1,SDL
SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。这些多媒体功能包括了音频、键盘和鼠标(事件)、游戏摇杆等。当然,最为重要的是提供了2D图形帧缓冲(framebuffer)的接口,以及为OpenGL与各种操作系统之间提供了统一的标准接口以实现3D图形。从这些属性我们可以看出,SDL基本上可以认为是为以电脑游戏为核心开发的多媒体库
2,int SDL_Init(Uint32 flags);
它的返回值是int,这个我们很熟悉。如果SDL成功初始化装载,函数返回0,如果异常,则返回-1。
3,Uint32
SDL使用了一个简单的约定:U就是unsigned(无符号,意味着非负)的意思,与之对应的S代表signed(有符号,可正可负);int还是整数的意思;32表示占32位,类似的,还可以占1至4个字节,即8,16,32,64位。Uint32的意思就是无符号的,占32位的整数类
4,flag
1) 关键字“位”,这意味着我们需要用二进制的观点看这个值,并且,这个值可以参与位运算;
2) 关键字“标”,这显然是标记的意思。小狗通常采用一些不文明的手段表明某个区域是自己的势力范围,而人类则通常采用插一面代表自己势力的旗帜,所以这就是flag的本意。
3) 关键字"s",这里使用了复数,表明我们可以不止插一面旗。
5,int SDL_WasInit(Uint32 flags);
这里,我们可以将SDL_INIT_*的5个具体旗子看成一种用法;使用了“|”的复合旗子以及那个EVERYTHING的概念看成另外一种用法。当flag为某个具体旗子的时候,如果该旗子插上了,则返回该旗子的位标值本身,否则就返回0。
6,五面旗子
#define SDL_INIT_TIMER 0x00000001
#define SDL_INIT_AUDIO 0x00000010
#define SDL_INIT_VIDEO 0x00000020
#define SDL_INIT_CDROM 0x00000100
#define SDL_INIT_JOYSTICK 0x00000200
#define SDL_INIT_EVERYTHING 0x0000FFFF
7,WasInit可以在Init前使用吗?
可以。
8,atexit();
atexit(function)在main()正常结束以及异常结束的时候,都会自动调用function()函数,所以,在我们不可预知程序是否会异常,或者不清楚程序什么时候结束的时候,需要做某些善后工作,atexit()是个很好的选择
9,SDL的退出 --- void SDL_Quit(void);
通常,我们在可以预测程序结束的时候直接使用语句:SDL_Quit();
更多的时候,以及SDL官方文档里面,也推荐使用:atexit(SDL_Quit);
10,SDL_Quit(); 的容错性
还是之前的那个问题的翻版,Quit可以在Init之前使用吗?答案依旧是肯定的。SDL_Quit();可以任意调用任意次,甚至不需要SDL_Init();的先行存在。
11,SDL flags 的中途装载和中途退出
int SDL_InitSubSystem(Uint32 flags);
与Init一样,返回值为0则成功装载,-1则失败。
中途退出某些flags的问题,我们显然就不能用SDL_Quit();了,因为这是所有flags全退。SDL提供了中途退出某些flags的函数:
void SDL_QuitSubSystem(Uint32 flags);
12,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);
它将清除所有错误信息。这用于清除掉你已经处理过的错误信息——否则即使没有异常,你仍然可能收到上次异常的错误信息。
13,事件(event)查询初探
int SDL_WaitEvent(SDL_Event *event); 等待 (什么都不做)
int SDL_PollEvent(SDL_Event *event); 轮询(继续做其他事情)
14,简单的显示一张BMP位图。
SDL_Surface *SDL_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags);
flag(s)仍然是SDL_SWSURFACE。它的作用是说明所建立的surface是储存在系统内存中的。实际上,SDL_SWSURFACE是一个“伪位标”,如果你读出它的值,会发现其实是0!这意味着任何其他位标(以及|组合)与SDL_SWSURFACE的&结果都是0。
SDL_Surface,为结构指针。
15,装载BMP格式的位图
SDL_Surface *SDL_LoadBMP(const char *file);
16,块移图面(blit surface)
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
src指的是要进行blit的源surface,dst指的是blit这个surface要去的目的地——另外一个surface。我们这里先忽略查到SDL_Rect结构的具体意思,仅仅需要了解的是,如果srcrect为空指针,意味着整个源surface将被blit;如果dstrect为空指针,意味着源surface与目的surface的左上角重合(坐标(0,0))。
blit是个有渊源的词语,我将来会在术语解释中具体提到。这个词的本意就是块(block)移动(transfer)的缩写blt,因为这个缩写缺少元音不好读,所以后来加上了i,就变成blit。
如果blit成功,则返回0;否则返回-1。
16,显示图片
int SDL_Flip(SDL_Surface *screen);
源图面被blit到目的图面上后,就与目的图面融为一体了。在我们的例子中,ShownBMP被“画”在了Screen上(我这里去掉了p,是为了说明这里讨论的是surface而不是surface的指针)。换句话说,Screen被修改了(似乎也可以用“染指”-_-!!),ShownBMP则没有改变。
另外一个需要了解的问题是,我们之前对surface的种种操作,实际上都是在修改surface数据结构中的某些数据,当我们最后需要将这些surface显示到屏幕上(我们打开的SDL操作窗口上),我们需要使用函数SDL_Flip()。如果函数调用成功,则返回0;否则返回-1。
SDL系列教程(一):SDL简介
SDL系列教程(二):配置
SDL系列教程(3):DC++
SDL系列教程(四):显示一幅图象
SDL系列教程之(五):扩展函数库
SDL系列教程(六):键盘事件
SDL系列教程(七):颜色码
SDL系列教程(八):图象的一部分
SDL系列教程(九):显示英文字体
SDL系列教程(十):显示精灵
SDL系列教程(十一):屏幕的滚动
SDL系列教程(十二):SDL线程
SDL系列教程(十三):地图的显示
SDL系列教程(十三)地图的显示2
SDL系列教程(十四):中文的显示
SDL系列教程(十四):中文显示2
SDL系列教程十五:精灵引擎(1)
SDL系列教程15:精灵引擎2
SDL在DEV C++配置(补充1)
SDL在DEV C++配置(补充2)
SDL系列教程:SDL和IME
整理得非常好的中文目录英文内容网站!