分类: LINUX
2006-05-26 11:10:54
SDL系列教程(四):显示一幅图象
作者:akinggw
在上两篇教程中,我们学习了什么是SDL和SDL的配置。在这一章中,我们将学习如何将一幅图象显示到屏幕上。
首先,按照我前面所说的方法建立一个SDL的项目,然后开始下面的内容。
大家先想一下,我们画图时应该怎样做。首先,我们需要一个载体,也就是我们要把图画到哪里?我们可以画到墙壁上,画到纸上,等等任何可以画的地方。而我们在屏幕上做画,当然屏幕就是这个载体。
有载体了,然后我们需要什么?需要一个做画的工具,一支毛笔,一支钢笔,等等。只要能在载体上留下图象,就可以了。而计算机用什么作画呢,用它的电子枪,从电子枪中射出电离子,用这些电离子撞击屏幕,这样就在屏幕上得到了我们想要的东西。当然,这些是计算机自己完成的,而我们要关心的是如何画。
想想看,假如我要在纸的下面画一只乌龟,我就必须将笔移到纸的下面。而在计算机屏幕上,我们应该如何移动呢?
如果你细心一点就会发现,报纸上的图象是由一个又一个点组成,而计算机图象也是一样。
一个计算机屏幕有多少个点呢?计算机用分辨率来表示,,800X600,1024X648等等,第一个数字表示屏幕的宽,第二个表示屏幕的高。我们用二维坐标系X,Y来表示计算机屏幕。
这样,我们要在屏幕哪个位置画图象,我们就可以设置X,Y坐标。
以上简单介绍了游戏的基本原理。
下面,我们将给出一个例程,以便于你更好的理解。
我们的代码是按照昨天的代码完成的。
首先,头文件不用设置了,但我们还需要几个参数:
const int SCREEN_WIDTH = 640; //屏幕宽度
const int SCREEN_HEIGHT = 480; //屏幕高度
const int SCREEN_BPP = 32; //屏幕所使用的像素色彩位数
前两个参数就是我们所说的,设置屏幕分辨率:640X480,第三个参数是设置我们屏幕使用的像素色彩位数。常用的色彩位数有8位,24位,32位等等,位数越大,色彩越丰富,我们显示的图象就更逼真。
/* 导入位图*/
SDL_Surface *load_image( char *filename )
{
//将图象暂时存储在这里
SDL_Surface* loadedImage = NULL;
//存储最佳的图象
SDL_Surface* optimizedImage = NULL;
//导入图象
loadedImage = SDL_LoadBMP( filename );
//如果导入图象不为空
if( loadedImage != NULL )
{
//建立最佳的图象
optimizedImage = SDL_DisplayFormat( loadedImage );
//释放老的图象
SDL_FreeSurface( loadedImage );
}
//返回最佳的图象
return optimizedImage;
}
建立一个函数,函数的目的就是导入一张以filename为名称的位图,然后返回图象指针。SDL_LoadBMP函数是SDL里面一个专门导入以bmp为扩展名的图象。图象如果导入正确,就将保存在loadedImage参数中。
但这样还有一个问题,假设我有很多图片,它们有可能是32位的,也有可能是24位的。
如果我要将它们全部显示到屏幕上,blit函数将把它们全部转换成一个统一的格式。但这样明显就降低了显示速度。
有没有一种办法能在显示之前将所有图象的格式转换成一样的。
答案是有。SDL_DisplayFormat函数的功能就是将图象的格式转换为同屏幕相同的格式。
例如:
在上面这个例子中,我们第一次导入到loadedImage中的图象是24位的,但屏幕的格式是32位的。因此,经过SDL_DisplayFormat函数转换后,我们的图象格式就变成了32位,然后保存在optimizedImage中。
对于原来24位的图象loadedImage,我们就不需要,所以就要调用SDL_FreeSurface函数去释放它。
最后返回32位的图象。
/*显示函数*/
void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
//建立一个暂时的矩形设置显示的坐标
SDL_Rect offset;
//设置坐标
offset.x = x;
offset.y = y;
//显示图象
SDL_BlitSurface( source, NULL, destination, &offset );
}
这个函数的目的就是将一张图象贴在屏幕上,参数x,y代表贴在屏幕什么位置,source表示要贴的图象,destination表示屏幕。Offset表示贴在屏幕哪个位置。
函数SDL_BlitSurface就是将source图象按照Offset规定的坐标贴在destination屏幕上。
然后,其它的程序和我们原来的一样,只是需要在设置好屏幕标题后,需要导入图象并在屏幕上显示它。具体代码如下:
/*导入图象*/
demo= load_image("hello_world.bmp");
done = 0;
/*在屏幕上画图*/
apply_surface(100,100,demo,screen);
然后进入游戏循环,在循环的过程中,我们需要不停地更新屏幕:
//更新屏幕
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
最后,图象显示完毕,我们要释放图象。
/*释放图象*/
SDL_FreeSurface(demo);
程序执行截图如下:
关于更多内容请访问金桥科普网站( )游戏开发栏目,如果你需要游戏开发方面的书籍请参考金桥书城游戏频道( )。 如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站( )游戏开发栏目,我将详细地为你解答。 在下一节中,我们将讲解如何显示压缩图象。 |