SDL 系列教程(十三):地图的显示

 

作者:akinggw

 

前言

 

在前面的章节中,我们说过要2D游戏的地图是由一个一个的瓷砖够成的。你可以编程实现这些瓷砖的显示,也可以通过一个特别的工具来实现。这就是——地图编辑器。

我记得在前面的某一篇中介绍过一个很好的地图编辑器。当然,如果你有足够的时间的话,也可以自己写。其实它也并不是那么复杂。而我还是选择使用别人的编辑器,既然有就用吧。因为还有其它很多的事情要做。

我选择使用Mappy,这个编辑器很出名,如果你真的不想自己写,又想使用方便的话,这个东东很适合你哦。

关于在各种环境下使用它编辑的地图,别人都已经写好了,就只有我们使用SDL的最惨了,打开地图的那个程序库打不开了。默哀三分钟….

不过如果你在网上仔细搜索的话,还是不那么容易找到的,如果需要给我来信。

 

 

SDLMappy 是一个专门用于导入fmp格式的地图(就是MAPPY产生的地图)的一段程序。就两个文件,一个头文件和一个CPP文件。

下载下来后将它复制到你的项目目录下,然后在项目中设置一下,就可以使用了。先看一下我得到的结果吧。

 

图注1

我制作地图的水平不是很好,反正这里也只是为了说明一下过程嘛。

下面,我们来详细地讲解一下 SDLMappy 中的一些成员函数的作用,这样有利于我们后面的理解。

 

int LoadMap (char * Filename , int x , int y , int Width , int Height);

 

导入由Filename指定的地图文件,然后装入内存,以便于以后使用。这个函数必须在其它函数之前调用。

如果成功将返回0,失败返回-1

 

X/Y 表示地图在屏幕上的输出起始位置。

Width/Height 表示地图在屏幕上的可视范围。

 

void MapInitAnims (void);

 

这个函数的作用就是说,假如我们在地图中使用了动画,比如流动的水等。就初始化这些动画。

 

void MapUpdateAnims (void);

 

这个函数的作用就是在画地图的循环过程中更新动画的显示。

 

int MapDrawBG (SDLSurface* s);

 

这个函数的作用就是画背景层,但不使用我们设置的透明色。

 

int MapDrawBGT (SDLSurface* s);

 

这个函数的功能和上一个函数一样,但要使用我们设置的透明色。

 

int MapChangeLayer (int layernumber);

 

因为我们的地图可能由很多层重叠在一起来构成的,因此我们就需要在具体的时候显示相应的层。这个函数的作用就是设置我们要显示的层。另外,MAPPY只支持8个层(07),如果你设置其它的数,它将返回错误。

 

int MapGetTile (int x, int y);

 

返回瓷砖xy这个瓷砖中的内容。X,y是表示地图文件中的瓷砖的位置,不是像素。如果返回是正数,那么说明只是一块普通的瓷砖,如果返回是负数,那么就可能这块瓷砖包含的是动画。

 

BLKSTR * MapGetBlock (int x, int y);

 

返回一个BLKSTR指针,用于冲突检测和检查瓷砖结构。注意:XY参数不是像素,而是地图中瓷砖的坐标。

 

BLKSTR *myblkstr;


Myblkstr=MapGetBlock(xoffinblocks,yoffinblocks);

If(myblkstr->tl){top left collision is set for this block}

 

MapSetBlock (int x, int y, int strvalue);

 

这个函数的作用是用于设置地图中相应瓷砖的属性,x,y就是我们选中的瓷砖,strvalue如果为正数的话,我们选中的瓷砖就是一般的图象,而相反如果是负数的话,我们选中的瓷砖就是动画。

 

WORD GetMapBPP( void );

 

返回当前地图的颜色深度。

 

WORD GetMapWidth( void );

 

得到当前地图的像素宽度。

 

WORD GetMapHeight( void );

 

得到当前地图的像素高度。

 

WORD GetMapWidthInBlocks( void );

 

返回当前地图的瓷砖宽度。

 

WORD GetMapHeightInBlocks( void );

 

返回当前地图的瓷砖高度。

 

WORD GetMapBlockWidth( void );

 

返回当前瓷砖的像素宽度。

 

WORD GetMapBlockHeight( void );

 

返回当前瓷砖的像素高度。

 

void MapMoveTo( int x , int y );

 

这个函数的作用就是根据坐标x,y来选择相应的瓷砖进行显示。

 

int MapGetXPosition( void );

 

这个函数的作用就是返回我们当前显示的地图的坐标X

 

int MapGetYPosition( void );

 

这个函数的作用就是返回我们当前显示的地图的坐标Y

 

int DrawParallax( CDXSurface * Surface );

 

这个函数的作用是画我们选择的视差界面。

 

BOOL CreateParallax( void );

 

这个函数的作用是从一个位图文件名建立并导入一个视差界面。如果函数返回真,就成功了,否则失败。

 

这就是SDLMappy中的类的成员函数的解释,下面我们来看一下,如何使用它们。

 

首先,建立一个SDL项目。

 

#include <SDLMappy.h>

 

然后在开始时,加入下面的头文件:

 

    SDLMappy* Map=new SDLMappy();

   

    if(Map->LoadMap("test1.fmp",0,0,640,480)==-1)

    printf("Cann't load test.fmpn");

 

然后建立一个SDLMappy实例,导入一个地图文件,设置它显示的区域。

 

    Map->MapInitAnims();

 

初始化地图中的动画。

 

        

        Map->MapUpdateAnims();

        Map->MapMoveTo(x,y);

        Map->MapChangeLayer(0);

        apply_surface( 0, 0, image, screen );       

        Map->MapDrawBGT(screen);

       

        SDL_Flip( screen );

 

在显示之前更新动画,地图的移动,显示背景,使用透明色显示地图。更新地图。



 

    SDL_FreeSurface(screen);

    SDL_FreeSurface(image);  

    //Quit SDL

    SDL_Quit();  

 

最后释放并退出,就这么简单。