狀態模式(State),在GoF 中的解釋是:
「讓一個物件的行為隨著內部狀態的改變而變化,而該物件也像是換了類別一樣。」
以流離之歌這款遊戲來說,在操作上就有以下其中幾個狀態
這圖為什麼都不選的狀態,在這狀態時,當滑鼠移到玩家單位或敵方單位時就會顯示出相對應的資訊
這圖為選取角色後的狀態,當在這狀態時,技能版面會固定在場面上,此時滑鼠可以移到技能版面上去做選取的動作
這圖為選取技能的狀態,相對應的技能會亮起,場面也會顯示出該技能範圍的相關提示
而這在目前的程式裡,分別是以下的三個類別,而這三個類別全都繼承了CellGridState
這個superclass
CALWaitingForInputCellGridState
CALAbilitySelectedCellGridState
ChangeSkillRangeShowCellGridState
除此之外,因為這中間會有技能撥放的時間,這段時間我們不會希望玩家擁有控制的能力,所以還有一個叫CALBlockInputCellGridState
用來阻擋玩家輸入的狀態。
至於為什麼要特別介紹這個,那是因為接下來我要重構的部分因為跟CellGridState
本身所提供的功能不太符合所以我打算拆開的地方
這款遊戲裡,教學裡是這樣形容玩家跟敵方的行動方式
而這是控制這三個回合狀態的CellGridState
CALAIAttackTurnCellGridState
CALPlayerTurnCellGridState
AIPrepareTurnCellGridState
而在這中間,會有段時間是玩家不能操控、只能觀看相關動作觸發的時間
但從上面對於CellGridState
的理解應該可以發覺它的功用是以下幾點
其實在敵人攻擊階段、敵人準備階段、還有玩家階段這幾個是不用特地在分成這幾種程式操控、而是全都用CALBlockInputCellGridState
這個功能來去阻擋玩家的輸入就好。雖然這幾個階段會觸發其他功能(ex:敵方AI計算)但這些並不是直接由CellGridState
去管理、而是偵測目前的狀態去觸發,所以跟CellGridState
本身沒有很直接的關係。
因為這篇打的比我想像的還長,會拆成第二篇打完,所以剩下的內容請期待明天!
設計模式與遊戲開發的完美結合(暢銷回饋版)
Turn Based Strategy Framework
流離之歌