本節書摘來異步社群《遊戲程式設計模式》一書中的第7章,第7.6節,作者: 【美】robert nystrom (尼斯卓姆) 譯者: 趙衛兵 , 許新星 , 姜召陽 , 陳侃 , 屈光輝 , 鄭炯彬 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
狀态模式的目标就是将每個狀态相關的所有的資料和行為封裝到相關類裡面。萬裡長征,我們僅僅邁出去了一步,我們還有更多路要走。
當主角更改狀态的時候,我們也會切換它的貼圖。現在,這段代碼包含在它要切換的狀态的上一個狀态裡面。當她從躲避狀态切換到站立狀态時,躲避狀态将會修改它的圖像:
我們希望的是,每一個狀态控制自己的圖像。我們可以通過給每一個狀态添加一個entey行為。
回到heroine類,我們修改代碼來處理狀态切換的情況:
這樣也可以讓我們簡化躲避狀态的代碼:
它所做的就是切換到站立狀态,然後站立狀态會自己設定圖像。現在,我們的狀态已經封裝好了。entry動作的一個最大的好處就是它不用關心上一個狀态是什麼,它隻需要根據自己的狀态來處理圖像和行為就可以了。
大部分的真實狀态圖裡面,我們有多個狀态對應同一個狀态。比如,我們的女主角會在她俯沖或者跳躍之後站立在地面上。這意味着,我們可能會在每一個狀态發生變化的時候重複寫很多代碼。但是,entry動作幫我們很好地解決了這個問題。
當然,我們也可以擴充這個功能來支援退出狀态的行為。我們可以定義一個exit函數來定義一些在狀态改變前的處理。