读书笔记 PCG in Games 程序化内容生成3 构造性方法,针对地牢式关卡
總起
本文主要基于Procedural Content Generation in Games第三章介紹構(gòu)造性方法,他們的主要用途在于地牢和關(guān)卡,這些方法能在極短進(jìn)行生成,并且不會(huì)進(jìn)行評(píng)估或重新生成。
關(guān)于PCG in Games之前的筆記可見(jiàn):
第一章讀書(shū)筆記 PCG in Games 程序化內(nèi)容生成 介紹 - 知乎
第二章讀書(shū)筆記 PCG in Games 程序化內(nèi)容生成2 基于搜索的方法 - 知乎
地牢的概念來(lái)源于桌游《龍與地下城》,并成為RPG游戲的一大特征,包括《塞爾達(dá)傳說(shuō)》系列和《最終幻想》系列。
Rougelike游戲來(lái)源于《Rogue》,特點(diǎn)是程序化實(shí)時(shí)生成地牢,《暗黑破壞神》是此類游戲的延續(xù)者。
一個(gè)典型的地牢生成方法考慮以下三種要素:
1.模型,以簡(jiǎn)單、抽象的方式替代整個(gè)地牢,并提供最終結(jié)構(gòu)的一個(gè)簡(jiǎn)單預(yù)覽;
2.構(gòu)造模型的方法;
3.根據(jù)模型創(chuàng)建真正地牢內(nèi)容的方法。
本章創(chuàng)建方法特性:
1.建設(shè)性的,每次運(yùn)行只產(chǎn)生一個(gè)輸出結(jié)果;
2.運(yùn)行速度快,有一些甚至可以實(shí)時(shí)創(chuàng)建關(guān)卡;
3.只提供有限的屬性,只能對(duì)結(jié)果進(jìn)行有限的控制。
本章將討論的方法:
1.空間分割法;
2.基于代理;
3.元胞自動(dòng)機(jī);
4.基于語(yǔ)法方法;
5.平臺(tái)生成方法。
構(gòu)造性方法
空間分割法
通過(guò)遞歸將空間進(jìn)行細(xì)分,并將獲得的子空間組織到一個(gè)樹(shù)型結(jié)構(gòu)中。對(duì)于計(jì)算機(jī)圖形來(lái)說(shuō)這類方法特別重要,比如高效的射線投射、視錐剔除和碰撞檢測(cè)。
具體的方法:
1.BSP(binary space partitioning,二元空間劃分),最流行;
2.四叉樹(shù)、八叉樹(shù)。
使用四叉樹(shù)生成地牢:
1.一張2^n*2^n像素的圖片,其內(nèi)容可以是黑白兩種顏色;
2.根節(jié)點(diǎn)代表整張圖片,四個(gè)子節(jié)點(diǎn)代表上個(gè)節(jié)點(diǎn)圖像的四個(gè)象限;
3.按照2的步驟一直分割,直到最終葉子節(jié)點(diǎn)只有一種顏色。
使用BSP生成地牢:
1.將空間沿著垂直或水平方向進(jìn)行分割,分出的單元格可以有不同的大小;
2.隨機(jī)選擇一個(gè)葉子節(jié)點(diǎn)繼續(xù)進(jìn)行分割;
3.設(shè)定一個(gè)葉子節(jié)點(diǎn)不能被分為某個(gè)更小的尺寸;
4.最終每個(gè)葉子節(jié)點(diǎn)都包含一個(gè)單一的房間;
5.擁有相同父節(jié)點(diǎn)的房間會(huì)進(jìn)行連接。
生成效果如下圖,a使用四叉樹(shù),b使用BSP:
本節(jié)生成地牢的方法遵循了一種宏觀方法,即算法扮演著全視地牢的建筑師角色,而不是像下節(jié)中基于代理的方法所呈現(xiàn)的一個(gè)“盲目的”挖掘者,它們通過(guò)遞歸分區(qū)生成地牢,并能保證所有生成的兩個(gè)房間都不會(huì)重疊。
基于代理方法
基于一個(gè)AI代理挖掘出地牢,該方法的AI行為參數(shù)對(duì)地牢的外觀有很大影響,但很難被猜測(cè),需要經(jīng)過(guò)大量的測(cè)驗(yàn)和試錯(cuò)。
一個(gè)高隨機(jī)的方法:
1.代理轉(zhuǎn)變方向的概率和放置房間的概率都設(shè)定為5%;
2.將代理設(shè)置到地圖的任意位置并朝向任意方向;
3.挖掘一個(gè)格子;
4.檢測(cè)是否要改變方向或放置房間;
5.如果沒(méi)有改變方向或放置房間,則將分別的概率提高5%;
6.在地牢沒(méi)有生成的足夠大之前,跳到第3步繼續(xù)生成。
?
?
這種高隨機(jī)的方法很容易出現(xiàn)重疊房間和死路,因此我們將對(duì)AI代理進(jìn)行一定的前瞻性設(shè)置。
第二種方法:
1.在地牢中放置一個(gè)代理;
2.設(shè)置變量Fr = 0,Fc = 0;
3.嘗試放置一個(gè)房間,保證它與任意房間不相交,如果放置了房間設(shè)置Fr為1;
4.嘗試在任意方向放置一個(gè)3到7個(gè)單位長(zhǎng)度的走廊,保證它與任意房間不相交,如果放置了走廊設(shè)置Fc = 1;
5.如果Fr == 1或者Fc == 1,則跳回到第2步。
這種方法相比而言稍微好了一點(diǎn),但是在最差情況下也有過(guò)早結(jié)束的問(wèn)題:
?
總之與本章中介紹的大多數(shù)方法相比,代理方法的參數(shù)會(huì)對(duì)生成結(jié)果的可玩性和娛樂(lè)價(jià)值產(chǎn)生非常大的影響,調(diào)整這些參數(shù)達(dá)到最佳效果并不是一件簡(jiǎn)單的任務(wù)。
元胞自動(dòng)機(jī)
元胞自動(dòng)機(jī)是一個(gè)離散型的計(jì)算模型,而它作為計(jì)算模型、生長(zhǎng)發(fā)育模型、物理現(xiàn)象模型等,在計(jì)算機(jī)科學(xué)、物理學(xué)甚至生物學(xué)的一些分支中得到了廣泛的研究。
原理:
1.由n維網(wǎng)絡(luò)、一組狀態(tài)和一組轉(zhuǎn)換規(guī)則構(gòu)成;
2.一般情況下使用的網(wǎng)絡(luò)是一維的(向量)或二維的(矩陣);
3.每一個(gè)元胞可以是狀態(tài)中一個(gè):最簡(jiǎn)單的例子狀態(tài)可以是打開(kāi)或關(guān)閉的;
4.實(shí)驗(yàn)開(kāi)始時(shí)各個(gè)細(xì)胞擁有各自的狀態(tài),然后隨著時(shí)間推進(jìn),每個(gè)元胞由自己和鄰居t-1時(shí)的狀態(tài)來(lái)確定t時(shí)的狀態(tài)。
領(lǐng)域(其大小可以是1或大于1):
1.一維,向左向后延伸的單位;
2.二維,Moore摩爾領(lǐng)域和von Neumann馮諾依曼領(lǐng)域。
?
Johnson等人使用元胞自動(dòng)機(jī)來(lái)生成類似洞穴的無(wú)限地牢,洞穴應(yīng)該看起來(lái)像是自然侵蝕形成的,而非擁有筆直的邊緣和角落。
控制地圖生成過(guò)程的四個(gè)參數(shù):
1.巖石單元的百分比(無(wú)法進(jìn)入的區(qū)域);
2.元胞自動(dòng)機(jī)運(yùn)行次數(shù)n;
3.定義巖石的鄰域閾值T;
4.鄰近細(xì)胞的數(shù)目。
生成步驟:
1.設(shè)置每個(gè)房間50x50的格子,每個(gè)細(xì)胞擁有兩種狀態(tài):空或石頭;
2.“噴灑”石頭,針對(duì)每個(gè)元胞有一定概率是石頭(比如0.5);
3.如果相鄰的細(xì)胞中至少有T個(gè)(例如5)是巖石,則該細(xì)胞在下一個(gè)時(shí)間變成巖石,否則它將變成自由空間;
4.以上的處理進(jìn)行n次(例如4)。
這樣簡(jiǎn)單的生成能獲得驚人的栩栩如生的洞穴房間,如下圖b,使用了參數(shù):n = 4、T = 5。
不過(guò)元胞自動(dòng)機(jī)也有其缺點(diǎn),它的參數(shù)比較難以理解,每個(gè)參數(shù)還對(duì)多項(xiàng)特性有影響,并且比較難以定制化。
基于語(yǔ)法方法
使用自然語(yǔ)言描述地牢結(jié)構(gòu)。
Adams使用圖像語(yǔ)法生成了一個(gè)FPS關(guān)卡:
1.節(jié)點(diǎn)代表房間;
2.相鄰的兩個(gè)節(jié)點(diǎn)代表兩個(gè)房間之間擁有一條走廊。
這種方法不會(huì)生成任何幾何細(xì)節(jié),比如房間大小。通過(guò)高層次的、拓?fù)涞年P(guān)卡進(jìn)行表示,接著搜索算法查找最為匹配的結(jié)果。
Adams研究的一個(gè)限制是語(yǔ)法規(guī)則,特別是參數(shù),它們是專門的且硬編碼的。
Dormans通過(guò)圖像語(yǔ)法生成有向圖,作為游戲任務(wù)流程順序的模型,每個(gè)任務(wù)都被抽象成節(jié)點(diǎn)和邊的網(wǎng)絡(luò),然后由形狀語(yǔ)法生成相應(yīng)的游戲空間。
受到Dormans研究的啟發(fā),van der Linden等人提出了一種用于生成地牢關(guān)卡的玩法語(yǔ)法。游戲設(shè)計(jì)師使用面向游戲玩法的詞匯來(lái)表達(dá)先驗(yàn)設(shè)計(jì)約束,包括玩家在游戲中執(zhí)行的指令,它們的順序和組合,相互關(guān)系和相關(guān)內(nèi)容。
以下圖片a展示了van der Linden等人編寫的具體語(yǔ)法內(nèi)容,b展示了最終生成的效果:
?
平臺(tái)生成方法——基于節(jié)奏
Smith等人基于節(jié)奏概念進(jìn)行關(guān)卡生成,將用戶時(shí)間和重復(fù)聯(lián)系在一起。
生成節(jié)奏組:
1.創(chuàng)造一系列玩家行動(dòng);
2.將這些行動(dòng)轉(zhuǎn)換成相應(yīng)的幾何圖形;
3.通過(guò)組合節(jié)奏組生成多個(gè)關(guān)卡;
4.評(píng)估選擇最佳關(guān)卡。
Smith提供了一個(gè)控制生成的過(guò)程:
1.一條貫穿關(guān)卡的道路;
2.生成不同類型的節(jié)奏;
3.幾何組件的類型和分配頻率;
4.收藏品跟關(guān)卡是分開(kāi)的。
每個(gè)節(jié)奏組也有一些參數(shù),比如跳躍頻率、跳躍道具(彈簧)出現(xiàn)的頻率。另一組參數(shù)提供對(duì)節(jié)奏長(zhǎng)度、密度、拍型的控制。
Smith等人所定義的節(jié)奏概念并不直接適用于地牢,但使用穿過(guò)房間和走廊的節(jié)奏可能具有類似的價(jià)值。
平臺(tái)生成方法——ORE
Mawhorter等人提出的Occupancy Regulated Extension(占用率查詢擴(kuò)展),這種方法依賴于預(yù)先編寫的關(guān)卡塊,然后使用關(guān)卡塊來(lái)組裝關(guān)卡。
步驟:
1.選擇一個(gè)隨機(jī)的潛在位置(占用率)來(lái)放置一個(gè)塊;
2.選擇一個(gè)與環(huán)境兼容的塊;
3.新的塊與已存在的關(guān)卡圖形進(jìn)行合并。
Mawhorter等人沒(méi)有提到算法中特殊的控制參數(shù),但是策劃仍然擁有一些控制。這種混合主導(dǎo)的方法能夠提供最大程度的控制,但是如果做得過(guò)火,這種方式和手動(dòng)構(gòu)建就基本沒(méi)什么區(qū)別了,能在PCG中所獲取的收益就會(huì)減少。
平臺(tái)生成示例
《洞穴探險(xiǎn)》關(guān)卡生成的階段:
1.通過(guò)可用模板房間生成關(guān)卡的主要布局,并放置入口點(diǎn)和出口點(diǎn);
2.障礙生成,使用代理穿過(guò)關(guān)卡在預(yù)留空間中啟發(fā)式的放置障礙物;
3.怪物生成,再使用另一個(gè)代理搜索并尋找足夠空間放置一個(gè)怪物。
?
《無(wú)限馬里奧》,Ben Weber提供了一種生成方法,基于代理進(jìn)行多次遍歷:
1.創(chuàng)建起始點(diǎn)到終點(diǎn)的初始通道;
2.添加山丘;
3.添加管道或大炮等靜態(tài)元素;
4.添加移動(dòng)的敵人;
5.添加未連接的水平塊;
6.添加可收集的硬幣。
本章可以使用平臺(tái)AI競(jìng)爭(zhēng)的關(guān)卡賽道生成器(Level Generation Track of the Platformer AI Competition)進(jìn)行練習(xí)。
總結(jié)
構(gòu)造性方法通常在roguelike游戲、平臺(tái)類游戲中使用,因?yàn)榉椒ㄟ\(yùn)行可預(yù)估且運(yùn)行時(shí)間短。
1.空間分割法,遞歸將區(qū)域分割的更小;
2.基于代理,使用某種方式穿越地牢進(jìn)行挖掘;
3.元胞自動(dòng)機(jī),可以創(chuàng)建類似自然侵蝕形成的效果;
4.基于語(yǔ)法方法,使用生成規(guī)則構(gòu)建地牢,在第五章有更廣泛的討論;
5.平臺(tái)生成方法,使用帶有概率的簡(jiǎn)單規(guī)則進(jìn)行生成,也很容易使用到地牢生成中。
參考
《Procedural Content Generation in Games》
總結(jié)
以上是生活随笔為你收集整理的读书笔记 PCG in Games 程序化内容生成3 构造性方法,针对地牢式关卡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Win7系统下文件或程序无法选择默认打开
- 下一篇: i3 10100和i5 10400的区别