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个层(0到7),如果你设置其它的数,它将返回错误。
int MapGetTile
(int x, int y);
返回瓷砖x,y这个瓷砖中的内容。X,y是表示地图文件中的瓷砖的位置,不是像素。如果返回是正数,那么说明只是一块普通的瓷砖,如果返回是负数,那么就可能这块瓷砖包含的是动画。
BLKSTR *
MapGetBlock (int x, int y);
返回一个BLKSTR指针,用于冲突检测和检查瓷砖结构。注意:X,Y参数不是像素,而是地图中瓷砖的坐标。
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();
最后释放并退出,就这么简单。