SDL系列教程——加载图片(转)

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);
 
 
程序执行截图如下: 

 

SDL系列教程之(五):扩展函数库的使用
作者:akinggw
朋友们,大家早上好!
经过这两天的观察,我发现我们的SDL系列文章受到了很大的关注,在此,我要在这里对所有关心我们栏目的朋友表示感谢,如果你有什么好的建议或想法,请来信告诉我。我的email是akinggw@126.com .
在上一节内容中,我们讲解了如何在屏幕上显示位图格式的图象。但现在的游戏中并不使用位图。这是因为它有一个致命的缺点,那就是体积过大。
如果我们将一幅图象转化成bmp和jpg两种格式,你会发现他们的体积差别是那么的大,bmp文件的体积可能是jpg文件的几十倍。
文件过大就为我们带来了一个问题,当我们做一个游戏时,可能有成千上万张图片,如果全部为BMP格式。一个很小的游戏可能也需要几张光盘来存储,显然这是不实际的。而采用压缩格式,我们可能只需要一张光盘就可以了。
当然JPG文件也有它的一个缺点,那就是图象由于压缩的关系,可能会出现图象失真。但这在游戏中是可能忽视不计。
好,下面我们就来讲解如何显示JPG等压缩图象。
首先,我们需要下载一个扩展函数库,你可以到下面的地址下载:
解压后,文件包含3个部分:头文件,静态库文件和动态库文件。
 
将它的头文件拷贝到VC的SDL头文件下,SDL的路径大概为:C:Program FilesMicrosoft Visual StudioVC98IncludeSDL.
然后将静态库文件(.lib)拷贝到VC的LIB目录下,LIB的路径大概为:C:Program FilesMicrosoft Visual StudioVC98Lib.
最后将动态库文件(.dll)全部拷贝到系统目录下,系统目录大概为:C:WINDOWSSYSTEM32.
新建一个SDL项目,打开“Project -> Settings
在“link表下的Object/library modules中粘贴:
SDL_image.lib
 
注意SDL_image.lib应在SDL.lib ,SDLmain.lib的后面。
 
设置到这里就基本完成。
 
打开我们前面的项目,在源代码文件中添加下面头文件:
#include "SDL/SDL_image.h"
 
修改我们的导入位图函数:
 
/* 导入图象*/
SDL_Surface *load_image( char *filename )
{
    //将图象暂时存储在这里
    SDL_Surface* loadedImage = NULL;
   
    //存储最佳的图象
    SDL_Surface* optimizedImage = NULL;
 //导入图象
    loadedImage = IMG_Load ( filename );
//如果导入图象不为空
    if( loadedImage != NULL )
    {
        //建立最佳的图象
        optimizedImage = SDL_DisplayFormat( loadedImage );
       
        //释放老的图象
        SDL_FreeSurface( loadedImage );
    }
//返回最佳的图象
    return optimizedImage;
}
将函数中的SDL_LoadBMP函数改为IMG_Load函数。
它是扩展库中的一个导入图象的函数,支持的图象格式有BMP, PNM, XPM, LBM, PCX, GIF, JPEG, TGA 和PNG。
 
其它的代码不用改动,最后,你可以显示一幅JPG图象试试。
我得到的图象显示结果如下:
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值