SDL的视频子系统

  SDL视频子系统

  在SDL中最为常用子系统就是视频子系统。这里说的视频不是指我们平常播放的电影等,而是指在屏幕上显示出来的东西,你需要在屏幕上显示图片、文字等那就必须使用视频子系统,否则什么都看不到,视频子系统支持:设置视频模式或者说创建视频窗口;支持直接的图像帧缓冲;支持Alpha像素混合;支持Blit位块传输(可以硬件加速);支持窗口管理;支持图形渲染。

  要使用视频子系统首先要创建一个SDL窗口(或者说设置SDL的显示模式),我们可以使用:

      /*
    功能:建立SDL显示表面
   参数:int width 窗口宽度  单位象素
            int height 窗口高度  单位象素
                int bpp 窗口象素位数,如果为0,则取当前窗口默认象素数
                Unit32  flags  位标,标示窗口特性
     返回值:SDL_Surface *,成功返回窗口指针,失败返回NULL
      */

  SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);

  来创建一个窗口,以后所有东西都必须刷到这个窗口才能显示。函数的返回值是SDL_Surface *,SDL_Surface也称表面(或者说蒙皮),是需要显示的东西,可能是一张图片,也可能是一个字符串。我们的应用中可能需要显示很多的东西,所以可能创建很多的表面,但请记住无论有多少个表面,但只有使用SDL_SetVideoMode函数产生的表面(或窗口)才能显示,其他任何表面必须刷到这个窗口上才可以显示,这一点很重要。打个比方这个窗口就像是一块白板,你需要显示的东西必须贴在白板上才能显示,并且后贴上的东西会覆盖以前的东西。下面是建立显示窗口的代码: 

 1 /*
 2   功能:建立SDL显示窗口
 3   作者:csl
 4   日期:2012-5-4
 5 */
 6 #include <stdio.h> 
 7 #include <stdlib.h> 
 8 #include "SDL.h"
 9 
10 SDL_Surface *gpScreen;//显示表面
11 
12 int main(int argc,char *argv[])
13 {
14     if((SDL_Init(SDL_INIT_VIDEO)==-1)) //初始化视频子系统
15     {
16         printf("Unable to init SDL: %s\n", SDL_GetError());
17         exit(-1);
18     }
19     atexit(SDL_Quit);// 注册SDL_Quit,当退出时调用,使得退出时程序自动清理
20 
21     //创建32位600*480窗口
22     gpScreen = SDL_SetVideoMode(600,480, 32, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF );
23     if(!gpScreen) 
24     { 
25         exit(1);
26     }
27 
28     SDL_Delay(3000); //暂停3秒
29     SDL_FreeSurface(gpScreen);//退出程序前必须释放 
30 
31     system("pause"); 
32     return 0; 
33 }

  gpScreen是显示窗口的指针,全局变量。第22行建立显示窗口,flags是位标,标示窗口特性,常用标示已经粗体显示:

SDL_SWSURFACE

在系统内存创建表面

SDL_HWSURFACE

在显内存创建表面

SDL_ASYNCBLIT

显示表面的异步更新,这回降低但cpu机器的性能,但在多处理器机子上会增加速度

SDL_ANYFORMAT

通常如果表面的像素深度不可用(比如你指定64,但你的机器不支持),则SDL将模拟一个影子表面。这个标志禁止这种做法。这将使SDL使用该表面不考虑bpp

SDL_DOUBLEBUF

使用双缓冲

SDL_FULLSCREEN

全屏模式

SDL_OPENGL

创建一个OpenGL渲染环境

SDL_RESIZABLE

创建一个可变尺寸的窗口

SDL_NOFRAME

创建一个无边框和标题的窗口。

  这些常量可以组合使用,比如SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE,表示在显存里创建一个全屏窗口,使用双缓冲。注意:一般使用全屏模式也会使用双缓冲;如果使用在显存创建表面也会使用双缓冲。建议使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出现错误可以尝试使用SDL_SWSURFACE。

   调用函数后应该检测gpScreen是否为空,为空则应结束程序。在程序退出前,必须调用SDL_FreeSurface释放gpScreen所指的窗口资源。

  关于SDL_Surface详细资料在视频子系统基本概念里做了详细的说明。 

 

posted @ 2012-05-04 13:17  成少雷  阅读(4810)  评论(0编辑  收藏  举报