RpgMakerXp地圖原理分析

文章約定:

紅色代表重要概念

綠色代表提示

注意:文章中使用的代碼均爲JavaScript標準的僞代碼。


要製作一個2D RPG遊戲,所需的地圖大的種類無非兩種:TileMapPicutreMap

這一章,我們主要針對於RpgMakerXp所實現的TileMap做分析。


首先我們來看看RpgMakerXp的地圖編輯界面。


圖塊大小爲32*32,地圖所使用圖塊數量爲20*15個格子。

所顯示的圖層有3個。


一般來說我們編輯時候顯示的內容就是最終顯示的內容,但是運行後卻發現,並不盡然。

如下情況:

我們先在圖層1繪製一個樹木然後我們在圖層2再使用其他圖塊遮蓋住這個樹木


運行一下看看效果:


這是怎麼一回事呢?我們不是用其他東西覆蓋了嗎?爲什麼還會出現?而且更爲奇怪的是,爲什麼只顯示了一半?

這裏,我們就有了另一個概念,圖塊級別


我們怎麼知道圖塊級別是如何設置的呢?如果您的電腦裏有RpgMakerXp的話,首先我們打開一個項目,然後選擇菜單中的工具-數據庫即可打開內部數據編輯界面。

我們使用的地圖爲001:草原,如下圖所示,我們目前選擇的是通行:塊(即,圖塊的全局可通行設置),手動選擇到優先級(即,圖塊級別)


這裏我們能看到,樹木的根部是沒有優先級的,然後從下往上分別是L2、L3、L4和L5。下面我們就來看看,這些級別分別是用來幹什麼的。


假設,我們在圖層1中的數據如下(以下數字代表繪製到地圖上的圖塊級別,0爲沒有優先級):

5 5 5 5

4 4 4 4

3 3 3 3

2 2 2 2

0 0 0 0 

圖層2中的數據如下:

0 0 0 0

1 1 1 1

2 2 2 2

3 3 3 3

4 4 4 4


顯示結果是如何的呢?按照RpgMakerXP的處理來說,流程會變成這樣(相對於每個地圖上要顯示的格子來說,並非相對於使用的地圖元件):

1.對這個格子的3個圖層根據圖塊級別排序,避免兩個圖層中圖塊級別一致導致繪製順序錯誤(以下是該實現的僞代碼)

data.layouts.sort(function (a, b) {
    if (a.圖塊級別 > b.圖塊級別 || (a.圖塊級別 == b.圖塊級別 && a.圖層 > b.圖層)) {
        return 1;
    } else if (a.圖塊級別 < b.圖塊級別 || (a.圖塊級別 == b.圖塊級別) && a.圖層 < b.圖層) {
        return -1;
    } else {
        return 0;
    }
});

2.將排序好的數據依次繪製到對應的圖塊級別畫布中(圖塊級別有5級,因此程序內建的畫布應該也有5個)

3.將畫布轉換成圖片進行緩存,以此來提高應用程序性能。


以上流程只會在地圖加載的時候執行一次,以後均取得圖片緩存直接繪製。


可是,爲什麼要這麼複雜呢?

因爲這樣才能夠實現人物與地圖的遮擋關係地圖圖塊與圖塊之間的遮擋關係


人物應該在最底層地圖緩存之後繪製。


如此我們來測試一下。


完美!~


但是,還有一個問題我們沒有解決。

那就是如何實現可通行判斷?

其實這個非常簡單,並不像地圖繪製那麼難。

但是這裏還是要說一下的。


由於圖層1、圖層2與圖層3中繪製的內容不一樣。

那麼就有可能在圖層2中有一個不可通行塊而圖層1和圖層3中沒有的情況。

這種情況我們只需要這樣簡單的判斷一下即可。

for(var i = 0; i < data.layouts.length; i++){
    if(data.layouts[i].是否可通行 == false) return false;
}
return true;


其餘概念請大家自行擴展。


本章至此結束,有問題請留言評論,謝謝!


Demo演示(Html5)

發佈了22 篇原創文章 · 獲贊 71 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章