Chinaunix首页 | 论坛 | 博客
  • 博客访问: 596632
  • 博文数量: 109
  • 博客积分: 1463
  • 博客等级: 上尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-22 13:21
个人简介

希望和广大热爱技术的童鞋一起交流,成长。

文章分类

全部博文(109)

文章存档

2017年(1)

2016年(2)

2015年(18)

2014年(1)

2013年(9)

2012年(15)

2011年(63)

分类: 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

整理得非常好的中文目录英文内容网站!

阅读(858) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~