SDL第五课从精灵图片上裁剪传输位图

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从精灵图片上裁剪传输位图

最后更新2009/12/28

精灵图片就是各个单独的图片的集合在一起构成的一个图片。当你有很多图片文件,但是不想处理这么多图片文件时,就可以使用精灵图片。为了得到一个单独的图片,就需要对精灵图片进行裁剪,从而只传输你想要的部分。在这一课,我们用有4个不同颜色的圆点(精灵)的精灵图片,来讲述怎么从精灵图片中裁剪出一个精灵(圆点)。

//声明画面指针

SDL_Surface *dots = NULL;

SDL_Surface *screen = NULL;

//声明事件结构

SDL_Event event;

//声明要传输的精灵图片的区域部分

SDL_Rect clip[ 4 ];

/*这里声明一些全局变量。有屏幕画面,事件结构。图片dots.png就是包含了所有圆点精灵的精灵图片。有四个SDL_Rect矩形结构的数组,用来存放圆点精灵要传输到的位置和矩形框大小(就是包含一个精灵的区域部分)。*/

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )

{

//Holds offsets

SDL_Rect offset;

//Get offsets

offset.x = x;

offset.y = y;

//Blit

SDL_BlitSurface( source, clip, destination, &offset );

}

/*这个是以前的位图传输函数,在这里稍微做了一些调整。新的参数是一个SDL_Rect结构的clip,clip定义了我们要传输的矩形画面。我们把默认的参数设置为NULL。即apply_surface( 0, 0, image, screen, NULL ) 和apply_surface( 0, 0, image, screen )是完全一样的。我们还改变了函数SDL_BlitSurface()调用的方式,不再将第二个参数设置为NULL,而是设置为clip。这样,SDL_BlitSurface()就会传输clip定义的源画面的区域。如果clip是NULL,就会传输整个源画面。*/

//裁剪精灵图片的左上角

clip[ 0 ].x = 0;

clip[ 0 ].y = 0;

clip[ 0 ].w = 100;

clip[ 0 ].h = 100;

//裁剪精灵图片的右上角

clip[ 1 ].x = 100;

clip[ 1 ].y = 0;

clip[ 1 ].w = 100;

clip[ 1 ].h = 100;

//裁剪精灵图片的左下角

clip[ 2 ].x = 0;

clip[ 2 ].y = 100;

clip[ 2 ].w = 100;

clip[ 2 ].h = 100;

//裁剪精灵图片的右下角

clip[ 3 ].x = 100;

clip[ 3 ].y = 100;

clip[ 3 ].w = 100;

clip[ 3 ].h = 100;

/*在主函数里,当一切初始化完成,图片已经加载以后,我们就可以设置裁剪的矩形范围了。我们采用下图的精灵图片:

并把要裁剪的矩形clip设定为指定的区域:

就像这样。现在我们准备从精灵图片上传输单独的精灵。*/

//把屏幕填充为白色

SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format,

0xFF, 0xFF, 0xFF ) );

/*我们调用SDL_FillRect()函数来填充屏幕为白色。SDL_FillRect()函数的第一个参数是画面,第二个参数是要填充颜色的区域,第三个参数是要填充的颜色。第二个参数是画面的clip_rect指定的区域或者是整个画面。*/

//将所有的图片放置到屏幕上

apply_surface( 0, 0, dots, screen, &clip[ 0 ] );

apply_surface( 540, 0, dots, screen, &clip[ 1 ] );

apply_surface( 0, 380, dots, screen, &clip[ 2 ] );

apply_surface( 540, 380, dots, screen, &clip[ 3 ] );

//刷新屏幕

if( SDL_Flip( screen ) == -1 )

{

return 1;

}

/*这样我们开始传输精灵。注意我们每次传输的都是相同的画面,不同的是我们传输的是画面的不同区块。最后的结果像这样:

从现在开始,当你想要程序中使用很多图片的时候,你不必面对成千上万的图片文件,只需要把他们集中到一个图片中,使用的时候,传输图片中你想要的区域部分就可以了。*/

相关文档
最新文档