游戲地圖的畫面是游戲中不可缺少的重要環節之一,要產生游戲地圖,除了可以直接使用已經繪制好的地圖外,對于一些畫面不太復雜,且具有重復性質的地圖或場景,有一個比較好的解決辦法,那就是利用地圖拼接的方法,將一小塊一小塊的小地圖組合成較大的地圖。
地圖拼接的優點在于節省系統資源,因為一張大型的地圖會占用比較多的內存空間,且加載速度較慢,如果游戲中使用了為數較多的大型地圖,那么勢必會降低程序運行時的性能,而且需要相當可觀的內存空間。
本篇隨筆從最基本的平面地圖貼圖開始講起,這種貼圖方法相當直觀,即利用一張張四方形的小圖塊組成同樣是四方形的大地圖。下圖便是一張由3種不同圖塊組合而成的平面地圖。
事實上,這張地圖是由4×3張小圖塊組成的,列方向是4張圖塊,行方向是3張圖塊,這里使用列與行這樣的字眼,是因為隨后將使用數組來定義地圖中出現圖塊的內容。
從這張圖中可以看到,一共出現了3中不一樣的地圖,這是因為程序中會事先以數組定義哪個位置上要出現哪一種地圖,使得拼接出來的地圖能夠符合需求。現在假設圖中3種不同圖塊的編號分別為0、1和2,那么可以以下面的這個一維數組來定義出上圖中的地圖。

int mapblock[12]=
{0,1,1,1, //第1列
2,0,1,2, //第2列
2,2,2,2}; //第3列
//為什么用一維數組而不是二維數組呢?
將這個一維數組以行列的方式排列,可以看出每個數組元素對應圖中的哪個圖塊。
需要提醒的是,由于使用的是一位數組來定義地圖內容,因此上面這個數組的每個元素的索引值是0……11.但是,由于程序里不論計算圖塊貼圖的位置還是計算整張地圖的長寬尺寸,都是以行列來進行換算的,所以需要將數組的索引值轉換成相應的列編號與行編號,轉換公式如下:
列編號 = 索引值 / 每一列的圖塊個數(行數);
行編號 = 索引值 % 每一列的圖塊個數(行數);
下圖驗證上面的公式,方格中的編號是一維數組的元素索引值。
這里需要注意的是,列編號與行編號的起始值都是從0開始算起,而一旦算出了列編號與行編號之后,便可以按照圖塊的寬與高來求出圖塊貼圖的位置,下面是計算圖塊左上點貼圖坐標的公式。
左上點X坐標 = 行編號 × 圖塊的寬度;
左上點Y坐標 = 列編號 × 圖塊的高度;
范例ch2_9:運用不同小圖塊,示范平面地圖拼接的技巧。
下載地址:ch2_9(上傳到windows live空間,可能需要MSN賬號登陸)
說明:程序源代碼中有相關的注釋。
程序運行結果如下圖:
PS:如想獲得更多關于Visual C++游戲開發的內容,可點擊隨筆:《Visual C++游戲編程基礎》學習筆記——索引隨筆。