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è)層(07),如果你設(shè)置其它的數(shù),它將返回錯(cuò)誤。

?

int MapGetTile (int x, int y);

?

返回瓷磚xy這個(gè)瓷磚中的內(nèi)容。X,y是表示地圖文件中的瓷磚的位置,不是像素。如果返回是正數(shù),那么說明只是一塊普通的瓷磚,如果返回是負(fù)數(shù),那么就可能這塊瓷磚包含的是動(dòng)畫。

?

BLKSTR * MapGetBlock (int x, int y);

?

返回一個(gè)BLKSTR指針,用于沖突檢測(cè)和檢查瓷磚結(jié)構(gòu)。注意:XY參數(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)單。