iT邦幫忙

2023 iThome 鐵人賽

DAY 17
2
Modern Web

什麼!在網頁上也可以寫遊戲?系列 第 17

[Day 17] 參考事件的實際應用-函數事件

  • 分享至 

  • xImage
  •  

昨天我們以等級系統去介紹了變數的應用,當然變數還有很多用途,之後還有時間的話再來介紹其他更進階的例子,而我們今天要來延續昨天的範例,在昨天的範例裡,我留了兩個部分,剛好用來作為今天的介紹素材。

我曾經在 [Day 08] 事件表實作 - 觸發篇 這一篇介紹過,事件分為 自動觸發事件參考事件 兩種,還演示了一個參考事件會用到的情況,就是檢查中的 否則觸發事件,但參考事件的用途並非只有這樣,該篇的總結我有提到,參考事件非常適合將某個流程給函數化,方便我們可以重複利用。

還記得前天提到的函數嗎?就像是動作一樣,將某個功能包裝起來,讓我們僅需要利用函數名稱,並且輸入一些資料,就可以快速的幫我們完成某件事情,而今天的目標就是將昨天範例中的某個部分,利用事件表的方式做成一個類似於函數的參考事件,藉此也可以讓各位了解,函數化前後的差異。

事前探討

在開始之前,我們先來討論昨天範例中的幾個部分,第一個部分是獲取經驗值的時機,第二個部分是關於等級上升的時機。

就昨天的範例來看,我們獲取經驗值唯一的手段是擊殺小怪,所以我們將改變經驗值變數的動作塞在擊殺小怪的事件內,這看起來沒有什麼問題,所以我們先來看第二個部分。

我們昨天用來檢查等級上升的事件,是一個自動觸發事件,也就是說該事件會不停的被觸發,從而一直檢查 {exp} >= {maxExp},但仔細想想的話,我們有需要讓它一直去檢查嗎?

經驗值的改變都是由於我們放置了動作,並且使其被執行後才會改變,也就是說經驗值的改變是有一個時機的,並不會突然無預警的改變,所以我們只要在每次經驗值改變時,再來檢查是否符合升等條件,是不是就不需要浪費多餘的時間去檢查該不該升等了呢?所以對於升等的處裡,更好的方式是讓我們每次改變經驗值時,才觸發檢查是否升等的事件,而不是讓它自顧自的不停的檢查。

回到第一個部分,假設我們真的在改變玩家經驗值時觸發檢查升等的事件,那就是在改變變數的下方會多出一個觸發事件的動作,由於我們目前獲取經驗值的時機只有擊殺小怪一途,所以看上去沒關係,但如果之後又多了其他途徑呢?例如任務獎勵、藏寶箱獎勵等任何可能也會增加經驗值的情況,那我們是不是每一個改變經驗值變數的動作下方,都還得再加一個觸發事件去觸發檢查升等?甚至是可能有些作者還會添加文字訊息,提示玩家獲得經驗值等,那這樣每次改變經驗值時,要新增的動作就會多很多。

為此參考事件的用途就來了,我們只要將改變經驗值變數、觸發檢查等級上升等其他相關動作,一起放在一個事件中,並且每次改變經驗值的時候,將要改變的值傳入到該事件並觸發,就能夠完美解決這個問題了。

開始製作參考事件

事件 - 檢查是否升等

首先讓我們回到昨天的範例中,先從事件 檢查是否升等 開始,於觸發中將該事件設定成 這個事件*不會*自動觸發,接著由於不會自動觸發的關係,事件本身的重複次數也可以重設為 0。

接著還有一個重要的問題,這個事件每次觸發通過時,都只會提升一次等級,但萬一我們突然獲得了可以一次提升很多等級的經驗量呢?就如同昨天我擊破經驗球後,一次從 1 升到了 4 等那樣,所以每次升等之後,我們應該再檢查一次是否升等,也就是讓該事件再觸發自己一次,這樣如果升等之後,依舊符合升等條件的話,就會不斷的觸發自己,直到經驗值 < 升等所需經驗值為止。

事件 - 獲得經驗值

接著就是另一個參考事件——獲得經驗值,同樣先改變事件的觸發狀態,接著從事件 擊殺怪物 裡,將改變 exp儲存全域變數 拉進來,並且編輯該動作,在這個事件中,我們不再是讓 exp{{instance.code}_exp} 了,由於我們待會會利用 觸發事件 將要增加的值以區域變數的方式傳遞進來,所以在這裡我們要改成區域變數的名稱,例如我取為 getExp 代表取得的經驗值量,所以完整的話就是 exp = {exp} + {getExp}

接著我們還要在這裡新增一個動作——觸發事件,觸發的事件代碼自然就是上面的 檢查是否升等,這樣每次經驗值增加時,就會自動觸發檢查是否升等了。

動作 - 觸發事件

最後剩下擊殺怪物的事件了,原本改變經驗值變數的動作,我們要替換成 觸發事件,而觸發的事件代碼就是 獲得經驗值

接著在觸發事件內還有一個 事件的區域變數,這個功能的用途是可以讓我們傳遞區域變數到指定觸發的事件當中,所以我們將剛剛定義的 getExp 取為變數名稱,而之前的 {{instance.code}_exp} 自然就是變數的值,代表被擊殺的怪物對應的經驗量。

事件 - 擊殺怪物

最後儲存動作後,將該動作拉到等待動作前即可,這樣當怪物死亡時,就會將自己的經驗量以區域變數 getExp 的方式傳給事件 獲得經驗值 並觸發,從而增加對應的玩家經驗值,並同時觸發檢查是否升等了。

至此為止要改的部分就結束了,假設之後真的需要在其他地方給予玩家經驗值時,就可以同樣利用觸發獲得經驗值事件,也不需要重複放置許多改變變數、檢查升等之類的動作,或是我們需要在玩家獲得經驗值時跳出提示,也只需要直接在該事件裡面添加一次即可,對於我們在事件表的設計上可說是便利了許多。

CG 範例事件表

總結

通過對昨天的範例進行修改,同樣的效果,不一樣的設計,前者是將增加經驗值直接放在擊殺怪物的事件裡,並隨時檢查是否升等,後者則是將增加經驗值額外拉成獨立事件,在擊殺怪物的事件中觸發該事件來改變經驗值,並且只有在經驗值增加時才會檢查是否升等。

總之今天向各位介紹了參考事件更加廣泛的用途,也就是將某個部分打包成一項功能,讓我們可以隨之取用,各位也能夠從效能、擴充性、便捷性等,去比較這兩個範例前後的差異,究竟哪一種設計方式對於我們在設計的路上更加具有優勢呢~


上一篇
[Day 16] 變數的實際應用-等級系統
下一篇
[Day 18] 建立圖層佈局介紹-圖層觀念篇
系列文
什麼!在網頁上也可以寫遊戲?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言