iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0

狀態模式(State),在GoF 中的解釋是:
「讓一個物件的行為隨著內部狀態的改變而變化,而該物件也像是換了類別一樣。」

以流離之歌這款遊戲來說,在操作上就有以下其中幾個狀態

這圖為什麼都不選的狀態,在這狀態時,當滑鼠移到玩家單位或敵方單位時就會顯示出相對應的資訊
https://ithelp.ithome.com.tw/upload/images/20220925/201518947HC8DWOI70.png

這圖為選取角色後的狀態,當在這狀態時,技能版面會固定在場面上,此時滑鼠可以移到技能版面上去做選取的動作
https://ithelp.ithome.com.tw/upload/images/20220925/20151894RDAGdEGXRw.png

這圖為選取技能的狀態,相對應的技能會亮起,場面也會顯示出該技能範圍的相關提示
https://ithelp.ithome.com.tw/upload/images/20220925/20151894nVI9RRKV2i.png

而這在目前的程式裡,分別是以下的三個類別,而這三個類別全都繼承了CellGridState這個superclass

  • CALWaitingForInputCellGridState
  • CALAbilitySelectedCellGridState
  • ChangeSkillRangeShowCellGridState

除此之外,因為這中間會有技能撥放的時間,這段時間我們不會希望玩家擁有控制的能力,所以還有一個叫CALBlockInputCellGridState用來阻擋玩家輸入的狀態。

至於為什麼要特別介紹這個,那是因為接下來我要重構的部分因為跟CellGridState本身所提供的功能不太符合所以我打算拆開的地方

這款遊戲裡,教學裡是這樣形容玩家跟敵方的行動方式
https://ithelp.ithome.com.tw/upload/images/20220925/20151894TxUJUrEH3m.png

而這是控制這三個回合狀態的CellGridState

  • CALAIAttackTurnCellGridState
  • CALPlayerTurnCellGridState
  • AIPrepareTurnCellGridState

而在這中間,會有段時間是玩家不能操控、只能觀看相關動作觸發的時間
https://ithelp.ithome.com.tw/upload/images/20220925/20151894g0sYplJzAI.png

但從上面對於CellGridState的理解應該可以發覺它的功用是以下幾點

  1. 點擊觸發事件的方式改變
  2. 角色狀態改變
  3. 技能範圍相關提示顯示

其實在敵人攻擊階段、敵人準備階段、還有玩家階段這幾個是不用特地在分成這幾種程式操控、而是全都用CALBlockInputCellGridState這個功能來去阻擋玩家的輸入就好。雖然這幾個階段會觸發其他功能(ex:敵方AI計算)但這些並不是直接由CellGridState去管理、而是偵測目前的狀態去觸發,所以跟CellGridState本身沒有很直接的關係。

因為這篇打的比我想像的還長,會拆成第二篇打完,所以剩下的內容請期待明天!

參考資料

設計模式與遊戲開發的完美結合(暢銷回饋版)
Turn Based Strategy Framework
流離之歌


上一篇
Day 10:GameLoop
下一篇
Day 12:State模式(二)
系列文
如何在Unity裡寫出具有一定擴充性的遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言