免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 860 | 回复: 0
打印 上一主题 下一主题

SDL系列教程(四):显示一幅图象 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-26 11:10 |只看该作者 |倒序浏览
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);


程序执行截图如下:


关于更多内容请访问金桥科普网站(
http://popul.jqcq.com
  )游戏开发栏目,如果你需要游戏开发方面的书籍请参考金桥书城游戏频道(
http://book.jqcq.com/category/1_70_740.html
)。 如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(
http://popul.jqcq.com
  )游戏开发栏目,我将详细地为你解答。
在下一节中,我们将讲解如何显示压缩图象。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/19671/showart_118360.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP