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();??
?
最后釋放并退出,就這么簡單。