《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程

相關(guān)游戲 相關(guān)文章

精彩庫游戲網(wǎng) 2019-05-31 22:51:29

  之前我們?yōu)榇蠹規(guī)砹耸赝蠕h地圖工坊的零基礎(chǔ)入門教程,而今天,為大家?guī)淼氖峭婕摇盀{涯”編寫的守望先鋒地圖工坊進階教程,一起來看看吧。

《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程 1

推薦閱讀

  守望先鋒地圖工坊零基礎(chǔ)入門新手教程

  守望先鋒地圖工坊應(yīng)用觀察者模式思想教程

  本文的目標(biāo)對象,是已經(jīng)有一定地圖工坊編寫經(jīng)驗的朋友。如果你并不熟悉,建議你閱讀其他教程。

  引言?

  相對于一門編程語言來說,地圖工坊的功能其實非?;A(chǔ)。它沒有函數(shù),更別提類了。不過,不知道你是否注意到,持續(xù)事件有一個特性:它可以持續(xù)等待,直到條件為真。

  編程里面有一個“設(shè)計模式”,叫做“觀察者模式”。它的意思是:當(dāng)一個對象變化時,會自動通知依賴它的對象。

  看到這里,不知道你有沒有覺得,持續(xù)事件和觀察者模式是有一定相似之處的:它們都是在“等”一個東西。

  簡化規(guī)則

  這個東西有什么用?我們可以借此來簡化規(guī)則的編寫。例如,我們要做一個等級系統(tǒng),當(dāng)經(jīng)驗達到100的時候就升一級,死亡的時候就掉50%經(jīng)驗,如果經(jīng)驗是負了,就掉一級。

  我們的經(jīng)驗來源可能不止一種,例如在RPG模式里,我們擊殺敵人可以獲得經(jīng)驗,摧毀防御塔也可以獲得經(jīng)驗。當(dāng)我們用傳統(tǒng)辦法寫規(guī)則的時候,我們就需要:

  1.擊殺敵人:增加經(jīng)驗,如果經(jīng)驗>100,增加等級,修改等級BUFF

  2.摧毀防御塔:增加經(jīng)驗,如果經(jīng)驗>100,增加等級,修改等級BUFF

  3.死亡:減少經(jīng)驗,如果經(jīng)驗<0,減少等級,修改等級BUFF

  你有沒有覺得,這是一個繁瑣的過程?當(dāng)你需要修改等級BUFF的時候,你需要修改很多條規(guī)則。

  我們再分析一下我們的邏輯:實際上,等級什么時候會增加,增加會有什么效果,這并不是我們的“死亡”事件該處理的。

  正確的做法是:有一個東西在“看著”經(jīng)驗,當(dāng)它大于100時,就代表升級了。當(dāng)它小于100時,就代表降級了。我們將其解耦后,規(guī)則就變成了:

  1.擊殺敵人:增加經(jīng)驗

  2.摧毀防御塔:增加經(jīng)驗

  3.死亡:減少經(jīng)驗

  4.觀察者1:如果經(jīng)驗>100,增加等級,修改等級BUFF

  5.觀察者2:如果經(jīng)驗<0,減少等級,修改等級BUFF

《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程 2

  換做游戲內(nèi)規(guī)則,即是:(假設(shè)用玩家變量A表示等級,玩家變量B表示經(jīng)驗)

  1.擊殺敵人:修改玩家變量(事件玩家, B, 加, 50)

  2.摧毀防御塔:修改玩家變量(事件玩家, B, 加, 30)

  3.死亡:修改玩家變量(事件玩家, B, 減, 50)

更多內(nèi)容:守望先鋒專題守望先鋒論壇

  觀察者1

  1.事件:持續(xù) - 每名玩家

  2.條件:玩家變量(事件玩家, B) >= 100

  3.動作:

  修改玩家變量(事件玩家, B, 減, 100)

  修改玩家變量(事件玩家, A, 加, 1)

  // 這里寫等級變化的邏輯

  等待(0.016, 無視條件)

  如條件為“真”則循環(huán)

《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程 3

  觀察者2

  1.事件:持續(xù) - 每名玩家

  2.條件:玩家變量(事件玩家, B) < 0

  3.動作:

  修改玩家變量(事件玩家, B, 加, 100)

  修改玩家變量(事件玩家, A, 減, 1)

  // 這里寫等級變化的邏輯

  等待(0.016, 無視條件)

  如條件為“真”則循環(huán)

  注意:

  一定要注意邏輯設(shè)計上不能存在死循環(huán),例如上面的例子里,觀察者2的條件不能寫“玩家變量 <= 0”。因為當(dāng)玩家經(jīng)驗=100時,觀察者1會將其變?yōu)?,就會觸發(fā)觀察者2。而觀察者2又會再次觸發(fā)觀察者1。這就導(dǎo)致了死循環(huán)的出現(xiàn)。

  我們在兩個觀察者最后都加上了循環(huán),目的是打破條件滿足的情況??紤]這種情況:當(dāng)我們一次性給玩家增加300點經(jīng)驗時,按理來說,應(yīng)該讓玩家升3級,但因為我們沒有循環(huán),玩家升了一級就結(jié)束了,并且后續(xù)增加經(jīng)驗,也不會再觸發(fā)升級。只有當(dāng)條件滿足被打破時,條件再次滿足,才會再次觸發(fā)該規(guī)則。

《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程 4

  模擬函數(shù)調(diào)用

  編程總是免不了函數(shù),但目前為止OW中沒有函數(shù)。但是,我們可以使用上面的方法,來模擬函數(shù)。

  還是用上面的例子。你會發(fā)現(xiàn)我們的等級變化邏輯還是寫了兩遍。我們能不能再將其獨立成一個規(guī)則?當(dāng)然是可以的。我們變化的目標(biāo)是玩家,因此我們需要使用一個玩家變量,來標(biāo)記我們需不需要對此玩家執(zhí)行等級變化邏輯。假設(shè)我們使用玩家變量C。

  首先,在游戲初始化的時候,將其設(shè)置為假。我們的規(guī)則就可以變成:

  觀察者1

  1.事件:持續(xù) - 每名玩家

  2.條件:玩家變量(事件玩家, B) >= 100

  3.動作:

  修改玩家變量(事件玩家, B, 減, 100)

  修改玩家變量(事件玩家, A, 加, 1)

  等待(0.016, 無視條件)

  如條件為“真”則循環(huán)

  設(shè)置玩家變量(事件玩家, C, 真)

《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程 5

  觀察者2

  1.事件:持續(xù) - 每名玩家

  2.條件:玩家變量(事件玩家, B) < 0

  3.動作:

  修改玩家變量(事件玩家, B, 加, 100)

  修改玩家變量(事件玩家, A, 減, 1)

  等待(0.016, 無視條件)

  如條件為“真”則循環(huán)

  設(shè)置玩家變量(事件玩家, C, 真)

  等級變化規(guī)則

  1.事件:持續(xù) - 每名玩家

  2.條件:玩家變量(事件玩家, C) == 真

  3.動作:

  // 這里寫等級變化的邏輯

  設(shè)置玩家變量(事件玩家, C, 假)

  注意:這里只是模擬函數(shù)調(diào)用,但實際上它比函數(shù)還是少很多東西。因此,并不是所有情況都適合這樣寫。

《守望先鋒》地圖工坊應(yīng)用觀察者模式思想教程 地圖工坊進階教程 6

  總結(jié)

  本文其實并沒有用什么很稀奇古怪的技術(shù),但本文的難點是思路的轉(zhuǎn)變:你需要將幾個本來不相同的邏輯,找出他們的共同點,并巧妙的將其拆分成多個邏輯,然后用規(guī)則來實現(xiàn)。

  到底要不要使用這種方式來設(shè)計規(guī)則?你需要考慮它的優(yōu)缺點。

  優(yōu)點有:將重復(fù)的內(nèi)容獨立出來,減少工作量,方便以后的修改(不僅需要修改的地方少了,漏改的可能性也更小了)。

  它也有缺點:增加了規(guī)則數(shù)量,增加了邏輯上的復(fù)雜度,運行效率稍低。

  個人認(rèn)為,適當(dāng)?shù)氖褂眠@種思路來設(shè)計規(guī)則,可以減少你的工作量和維護難度。但并不代表這種方式一定就是最好的,你應(yīng)當(dāng)考慮你的實際情況。

  以上就是為大家?guī)淼氖赝蠕h地圖工坊進階教程,大家都學(xué)會了嗎?

更多內(nèi)容:守望先鋒專題守望先鋒論壇

這些是你想要的嗎?

網(wǎng)友評論

0條評論