SDL_INIT_AUDIO SDL_INIT_VIDEO SDL_INIT_CDROM SDL_INIT_TIMER
在SDL。H 里有这么一段宏定义
/* These are the flags which may be passed to SDL_Init() -- you should specify the subsystems which you will be using in your application. */ #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_NOPARACHUTE 0x00100000 /* Don't catch fatal signals */ #define SDL_INIT_EVENTTHREAD 0x01000000 /* Not supported on all OS's */ #define SDL_INIT_EVERYTHING 0x0000FFFF
它可以同时初始和加载几个SDL库,使用如下方法 SDL_Init( SDL_INIT_AUDIO | SDL_INIT_VIDEO); 使用完毕最后调用SDL_Quit();接着关于使用 SDL_SetVideoMode()函数,函数原型如下
SDL_Surface *SDL_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags);采用 SDL_SetVideoMode()来初始化屏幕。这个屏幕是特指SDL绘制的窗口,并不是指整个屏幕。
width,height是输出高和宽,bitsperpixel 就是指bpp.即每点像素数,取值 8,16,32,值越大,说明屏幕表现力越丰富。它取决于显示器或LCD的硬件性能。一般桌面显示器是32.嵌入式设备的bpp可以用fbset 命令来查看。在我的本本上结果如下
[root@localhost bluesky]# fbset mode "1366x768" geometry 1366 768 1366 768 32 timings 0 0 0 0 0 0 0 rgba 8/16,8/8,8/0,0/0 endmode [root@localhost bluesky]#
flags 常见取值有如下(可以取多个值)
SDL_SWSURFACE : 数据区建立在系统内存之上SDL_DOUBLEBUF: 硬件双缓冲,必须与SDL_HWSURFACE同时使用。 /*还有其它一些值,就不一一例举*/
这个函数,差不多了,不理解没关系,知道用就会,我可是实实大的实用主义,当初用SDL完成一个项目,都还不知道SDL是什么意思?今天看条新闻说美国最大的悲剧,竟然是都不知道下一届领导人是谁?其实我们也不一样,知道了又怎么样,知之为知之,不知为不知,不知者无罪。 其实函数还没讲完,如果有看过Linux内核或Linux驱动的,我们需要一双犀利眼,眼前一亮
SDL_Surface
一定是一个结构体,是的这么简单的问题还说,直接上结构体来得快一点
Name SDL_Surface -- Graphical Surface Structure Structure Definition typedef struct SDL_Surface { Uint32 flags; /* Read-only */ SDL_PixelFormat *format; /* Read-only */ int w, h; /* Read-only */ Uint16 pitch; /* Read-only */ void *pixels; /* Read-write */ /* clipping information */ SDL_Rect clip_rect; /* Read-only */ /* Reference count -- used when freeing surface */ int refcount; /* Read-mostly */ /* This structure also contains private fields not shown here */ } SDL_Surface;
暂放到这里,这个结构体总要填满的。接着讲SDL_LoadBMP();这样的函数,就乱费口水了,下面要讲一个重量级的函数。
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);
src指的是要进行blit的源surface,dst指的是blit这个surface要去的目的地——另外一个surface。这不SDL_Rect结构出来了吧!由于过于简单, typedef struct{ Sint16 x, y; Uint16 w, h;} SDL_Rect; 因为显示器通常是矩形的,所以,矩形是计算机图形学中最基本的操作区域单元。这个结构很简单,x和y是矩形的左上角坐标。x从左到右增加;y从上到下增加。左上角的坐标就是(0,0)——SDL中就是这样的。w是矩形的宽,h是矩形的高。而对于整个函数来说,仅仅需要了解的是,如果srcrect为空指针,意味着整个源surface将被blit;如果dstrect为空指针,意味着源surface与目的surface的左上角重合(坐标(0,0))。 blit是个有渊源的词语,这个词的本意就是块(block)移动(transfer)的缩写blt,因为这个缩写缺少元音不好读,所以后来加上了i,就变成blit。 如果blit成功,则返回0;否则返回-1。
现在回过头去看sdl01.cpp 程序,SDL_Surface是不是填满了呢??
接着显示,暂停,释放,关闭就不多说了,函数太简单。
那接下干什么呢?把代码写长一点,这不手痒了,还把代码贴上,如果不想动手的直接去http://lazyfoo.net/SDL_tutorials/lesson02/index.php下,当然,做为好学生的你,动动手还是可以的。
#include "SDL/SDL.h" #include <string> //设置屏幕属性,此屏非彼屏 const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int SCREEN_BPP = 32; SDL_Surface *message = NULL; SDL_Surface *background = NULL; SDL_Surface *screen = NULL; SDL_Surface *load_image( std::string filename ) { //Temporary storage for the image that's loaded SDL_Surface* loadedImage = NULL; //The optimized image that will be used SDL_Surface* optimizedImage = NULL; loadedImage = SDL_LoadBMP( filename.c_str() ); if( loadedImage != NULL ){ //Create an optimized image optimizedImage = SDL_DisplayFormat( loadedImage ); SDL_FreeSurface( loadedImage ); } return optimizedImage; } void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { //Make a temporary rectangle to hold the offsets SDL_Rect offset; //Give the offsets to the rectangle offset.x = x; offset.y = y; //块移表面 SDL_BlitSurface( source, NULL, destination, &offset ); } int main( int argc, char* args[] ) { //初努化SDL子系统 if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ){ return 1; } //设置屏幕属性 screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); if( screen == NULL ){ return 1; } //设置窗口 caption SDL_WM_SetCaption( "Hello World", NULL ); message = load_image( "hello.bmp" ); background = load_image( "background.bmp" ); //Apply the background to the screen apply_surface( 0, 0, background, screen ); apply_surface( 320, 0, background, screen ); apply_surface( 0, 240, background, screen ); apply_surface( 320, 240, background, screen ); //Apply the message to the screen apply_surface( 180, 140, message, screen ); //显示到屏幕 if( SDL_Flip( screen ) == -1 ){ return 1; } //等待2S SDL_Delay( 2000 ); //释放表面 SDL_FreeSurface( message ); SDL_FreeSurface( background ); SDL_Quit(); return 0; }
保存为sdl02.cpp ,然后
[bluesky@localhost sdl]$ g++ -o sdl02 sdl02.cpp -lSDL
[bluesky@localhost sdl]$ ./sdl02
有图有真像,图不知道害死了多少人,那个谁和谁。这图不又把我又害了,出现如上一节一样的现象,慢慢来了,知道有这什么一回事就可以了。总有一天会解决的。
把代码写长一点,从其中的三个if可知是为安全起见,必竟人有失手,马有失蹄,计算机也出问题的时候,总得写个if足以体现我们对代码,对事,对人的严谨。