SDL第五课从精灵图片上裁剪传输位图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
/*这样我们开始传输精灵。注意我们每次传输的都是相同的画面,不同的是我们传输的是画面的不同区块。最后的结果像这样:
从现在开始,当你想要程序中使用很多图片的时候,你不必面对成千上万的图片文件,只需要把他们集中到一个图片中,使用的时候,传输图片中你想要的区域部分就可以了。*/