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();??

?

最后釋放并退出,就這么簡單。