Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1419936
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类: LINUX

2006-05-26 11:10:54

SDL系列教程(四):显示一幅图象

作者:akinggw

在上两篇教程中,我们学习了什么是SDLSDL的配置。在这一章中,我们将学习如何将一幅图象显示到屏幕上。

首先,按照我前面所说的方法建立一个SDL的项目,然后开始下面的内容。

大家先想一下,我们画图时应该怎样做。首先,我们需要一个载体,也就是我们要把图画到哪里?我们可以画到墙壁上,画到纸上,等等任何可以画的地方。而我们在屏幕上做画,当然屏幕就是这个载体。

有载体了,然后我们需要什么?需要一个做画的工具,一支毛笔,一支钢笔,等等。只要能在载体上留下图象,就可以了。而计算机用什么作画呢,用它的电子枪,从电子枪中射出电离子,用这些电离子撞击屏幕,这样就在屏幕上得到了我们想要的东西。当然,这些是计算机自己完成的,而我们要关心的是如何画。

想想看,假如我要在纸的下面画一只乌龟,我就必须将笔移到纸的下面。而在计算机屏幕上,我们应该如何移动呢?

如果你细心一点就会发现,报纸上的图象是由一个又一个点组成,而计算机图象也是一样。

一个计算机屏幕有多少个点呢?计算机用分辨率来表示,,800X6001024X648等等,第一个数字表示屏幕的宽,第二个表示屏幕的高。我们用二维坐标系XY来表示计算机屏幕。

这样,我们要在屏幕哪个位置画图象,我们就可以设置XY坐标。

 

以上简单介绍了游戏的基本原理。

下面,我们将给出一个例程,以便于你更好的理解。

 

我们的代码是按照昨天的代码完成的。

 

首先,头文件不用设置了,但我们还需要几个参数:

 

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时有什么问题,请到金桥科普网站(  )游戏开发栏目,我将详细地为你解答。

在下一节中,我们将讲解如何显示压缩图象。

阅读(1876) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~