SDL
系列教程(十三):地圖的顯示
?
作者:akinggw
?
前言
?
在前面的章節(jié)中,我們說過要2D游戲的地圖是由一個(gè)一個(gè)的瓷磚夠成的。你可以編程實(shí)現(xiàn)這些瓷磚的顯示,也可以通過一個(gè)特別的工具來實(shí)現(xiàn)。這就是——地圖編輯器。
我記得在前面的某一篇中介紹過一個(gè)很好的地圖編輯器。當(dāng)然,如果你有足夠的時(shí)間的話,也可以自己寫。其實(shí)它也并不是那么復(fù)雜。而我還是選擇使用別人的編輯器,既然有就用吧。因?yàn)檫€有其它很多的事情要做。
我選擇使用Mappy,這個(gè)編輯器很出名,如果你真的不想自己寫,又想使用方便的話,這個(gè)東東很適合你哦。
關(guān)于在各種環(huán)境下使用它編輯的地圖,別人都已經(jīng)寫好了,就只有我們使用SDL的最慘了,打開地圖的那個(gè)程序庫(kù)打不開了。默哀三分鐘….
不過如果你在網(wǎng)上仔細(xì)搜索的話,還是不那么容易找到的,如果需要給我來信。
?
?
SDLMappy
是一個(gè)專門用于導(dǎo)入fmp格式的地圖(就是MAPPY產(chǎn)生的地圖)的一段程序。就兩個(gè)文件,一個(gè)頭文件和一個(gè)CPP文件。
下載下來后將它復(fù)制到你的項(xiàng)目目錄下,然后在項(xiàng)目中設(shè)置一下,就可以使用了。先看一下我得到的結(jié)果吧。
?
|
圖注1
|
我制作地圖的水平不是很好,反正這里也只是為了說明一下過程嘛。
下面,我們來詳細(xì)地講解一下
SDLMappy
中的一些成員函數(shù)的作用,這樣有利于我們后面的理解。
?
int LoadMap (char * Filename , int x , int
y , int Width , int Height);
?
導(dǎo)入由Filename指定的地圖文件,然后裝入內(nèi)存,以便于以后使用。這個(gè)函數(shù)必須在其它函數(shù)之前調(diào)用。
如果成功將返回0,失敗返回-1。
?
X/Y
表示地圖在屏幕上的輸出起始位置。
Width/Height
表示地圖在屏幕上的可視范圍。
?
void MapInitAnims
(void);
?
這個(gè)函數(shù)的作用就是說,假如我們?cè)诘貓D中使用了動(dòng)畫,比如流動(dòng)的水等。就初始化這些動(dòng)畫。
?
void
MapUpdateAnims (void);
?
這個(gè)函數(shù)的作用就是在畫地圖的循環(huán)過程中更新動(dòng)畫的顯示。
?
int MapDrawBG
(SDLSurface* s);
?
這個(gè)函數(shù)的作用就是畫背景層,但不使用我們?cè)O(shè)置的透明色。
?
int MapDrawBGT
(SDLSurface* s);
?
這個(gè)函數(shù)的功能和上一個(gè)函數(shù)一樣,但要使用我們?cè)O(shè)置的透明色。
?
int MapChangeLayer
(int layernumber);
?
因?yàn)槲覀兊牡貓D可能由很多層重疊在一起來構(gòu)成的,因此我們就需要在具體的時(shí)候顯示相應(yīng)的層。這個(gè)函數(shù)的作用就是設(shè)置我們要顯示的層。另外,MAPPY只支持8個(gè)層(0到7),如果你設(shè)置其它的數(shù),它將返回錯(cuò)誤。
?
int MapGetTile
(int x, int y);
?
返回瓷磚x,y這個(gè)瓷磚中的內(nèi)容。X,y是表示地圖文件中的瓷磚的位置,不是像素。如果返回是正數(shù),那么說明只是一塊普通的瓷磚,如果返回是負(fù)數(shù),那么就可能這塊瓷磚包含的是動(dòng)畫。
?
BLKSTR *
MapGetBlock (int x, int y);
?
返回一個(gè)BLKSTR指針,用于沖突檢測(cè)和檢查瓷磚結(jié)構(gòu)。注意:X,Y參數(shù)不是像素,而是地圖中瓷磚的坐標(biāo)。
?
BLKSTR *myblkstr;
Myblkstr=MapGetBlock(xoffinblocks,yoffinblocks);
If(myblkstr->tl){top
left collision is set for this block}
?
MapSetBlock (int
x, int y, int strvalue);
?
這個(gè)函數(shù)的作用是用于設(shè)置地圖中相應(yīng)瓷磚的屬性,x,y就是我們選中的瓷磚,strvalue如果為正數(shù)的話,我們選中的瓷磚就是一般的圖象,而相反如果是負(fù)數(shù)的話,我們選中的瓷磚就是動(dòng)畫。
?
WORD GetMapBPP(
void );
?
返回當(dāng)前地圖的顏色深度。
?
WORD GetMapWidth(
void );
?
得到當(dāng)前地圖的像素寬度。
?
WORD GetMapHeight(
void );
?
得到當(dāng)前地圖的像素高度。
?
WORD
GetMapWidthInBlocks( void );
?
返回當(dāng)前地圖的瓷磚寬度。
?
WORD
GetMapHeightInBlocks( void );
?
返回當(dāng)前地圖的瓷磚高度。
?
WORD
GetMapBlockWidth( void );
?
返回當(dāng)前瓷磚的像素寬度。
?
WORD
GetMapBlockHeight( void );
?
返回當(dāng)前瓷磚的像素高度。
?
void MapMoveTo(
int x , int y );
?
這個(gè)函數(shù)的作用就是根據(jù)坐標(biāo)x,y來選擇相應(yīng)的瓷磚進(jìn)行顯示。
?
int
MapGetXPosition( void );
?
這個(gè)函數(shù)的作用就是返回我們當(dāng)前顯示的地圖的坐標(biāo)X。
?
int
MapGetYPosition( void );
?
這個(gè)函數(shù)的作用就是返回我們當(dāng)前顯示的地圖的坐標(biāo)Y。
?
int DrawParallax(
CDXSurface * Surface );
?
這個(gè)函數(shù)的作用是畫我們選擇的視差界面。
?
BOOL
CreateParallax( void );
?
這個(gè)函數(shù)的作用是從一個(gè)位圖文件名建立并導(dǎo)入一個(gè)視差界面。如果函數(shù)返回真,就成功了,否則失敗。
?
這就是SDLMappy中的類的成員函數(shù)的解釋,下面我們來看一下,如何使用它們。
?
首先,建立一個(gè)SDL項(xiàng)目。
?
#include
<SDLMappy.h>
?
然后在開始時(shí),加入下面的頭文件:
?
???
SDLMappy* Map=new SDLMappy();
???
???
if(Map->LoadMap("test1.fmp",0,0,640,480)==-1)
???
printf("Cann't load test.fmpn");
?
然后建立一個(gè)SDLMappy實(shí)例,導(dǎo)入一個(gè)地圖文件,設(shè)置它顯示的區(qū)域。
?
???
Map->MapInitAnims();
?
初始化地圖中的動(dòng)畫。
?
?
??????
???????
Map->MapUpdateAnims();
???????
Map->MapMoveTo(x,y);
???????
Map->MapChangeLayer(0);
???????
apply_surface( 0, 0, image, screen );???????
???????
Map->MapDrawBGT(screen);
???????
???????
SDL_Flip( screen );
?
在顯示之前更新動(dòng)畫,地圖的移動(dòng),顯示背景,使用透明色顯示地圖。更新地圖。
?
???
SDL_FreeSurface(screen);
???
SDL_FreeSurface(image);??
???
//Quit SDL
???
SDL_Quit();??
?
最后釋放并退出,就這么簡(jiǎn)單。