當前位置: 華文問答 > 遊戲

由unity引擎做的遊戲【缺氧】,它的地圖的機制是怎麽實作的?

2017-07-23遊戲

自動圖塊是指當一個圖塊放置在地圖上之後會自動根據鄰接狀態調整自身和與其鄰接的其它圖塊,使其與附近的相關圖塊之間達成連貫的過渡。

如圖1所示,同樣的一種圖塊,根據其鄰接關系不同,有48種不同的過渡方式。如果靠地圖設計師根據鄰接狀態手動選擇圖塊進行拼接的話,既費時間,也容易出錯。因此我們需要在遊戲引擎或程式化生成遊戲地圖(PCG)的過程中引入自動圖塊演算法。

圖1. 同樣的一種圖塊,根據其鄰接關系不同,有48種不同的過渡方式

我們用0(藍色海洋)、1(綠色陸地)兩種狀態來表征一個圖塊的狀態。一種直觀的自動圖塊演算法是,對目標位置為1的八鄰域按照西北、北、東北、東、東南、南、西南、西的順時針順序做編碼,然後根據編碼的值來確定目標位置顯示的過渡圖片,如下圖所示:

圖2. 根據一個圖塊的八鄰域來確定該圖塊顯示什麽影像

根據一個圖塊的8個鄰域的圖塊的狀態不同,其實有256(2的8次方)種不同的鄰接狀態,但在不同的鄰接狀態下可能選用同一塊鄰接圖片。如圖3所示,在0001100和0000100兩種編碼狀態下,中心點鄰接的8個鄰域狀態並不相同,但是中心處采用的是同一張圖塊素材。 這說明用圖塊的8個鄰接位置進行編碼,會引入較多的冗余情況。把冗余的情況去掉,其實每個地圖塊只需要存48張圖片就可以了,即圖1中的48種圖塊。

圖3. 這兩種情況下,雖然八鄰域地圖種類不同,但中心位置的圖塊均為13號圖塊

如果我們不是儲存完整的圖塊,而是將每個圖塊拆成左上、右上、左下、右下四份,那麽每一個角只需要考慮3鄰域,比如下圖中的NW角只需要考慮當前塊的上、左與左上方向的塊即可確定當前角的種類。這樣理論上需要儲存的圖片數量是 2的3次方 乘以 4 個1/4 大小的圖塊即可,圖片容量明顯下降。

圖4. 將一個地圖塊進一步拆分成四個部份分別進行繪制再拼合

RPG Maker 編輯器中的自動圖塊系統,將一個完整的圖塊劃分為4個象限區域,每個象限區域根據各自的三鄰域來確定自己由哪個備選角點圖案拼成。如下圖所示,我們將素材圖片劃分為20個子區域,其中右上角標註綠色的子區域是圖塊第一象限(NE)的候選角點圖片,左上角標註紅色的子區域是圖塊第二象限(NW)的候選角點圖片,左下角標註黃色的子區域是圖塊第三象限(SW)的候選角點圖片,右下角標註藍色的子區域是圖塊第四象限(SE)的候選角點圖片。

圖5. RPG Maker 中使用的 Tile 素材格式

每一個象限的候選圖只需要根據該角點相鄰的3個鄰接區域來確定。例如圖塊第一象限采用哪個候選圖,只需要考慮上、右、右上三個鄰接圖塊的狀態。其它三個象限的候選圖用同樣的方式來確定。

圖6. 根據右上角點的上、右、右上三鄰域圖塊的種類與當前圖塊是否一致,有5種備選圖案

假設遊戲中每個圖塊的分辨率為 64 * 64 ,用這種編碼方式實作自動圖塊演算法,每種地形的圖塊集素材的大小僅為 128 * 192,遠遠小於儲存256張或48張地圖圖塊的儲存空間。

這個演算法來源於1987年 SIGGRAPH 上由 Lorensen 和 Cline 提出的 Marching Cubes (MC) 演算法。它的2D版本通常被稱為 Marching squares。

圖7. Marching squares 原理示意圖

我將 RPG Maker 這種基於 Marching squares 的自動圖塊演算法實作後,制作了一個RM地圖自動生成工具,可以一鍵為 RPG Maker MV 與 RPG Maker MZ 編輯器生成地圖數據。感興趣的話可以試一下:https:// huanggaole.github.io/au toRMmap/

這個工具的使用說明:【RMMV】RM地圖自動生成線上工具使用說明——自動生成地牢迷宮_嗶哩嗶哩_bilibili

圖7. RM地圖自動生成線上工具——自動生成地牢迷宮