Cocos2d 游戏状态机
加cocos2d 是標題黨。
事實上跟cocos2d無關。
1.游戲背景介紹
比方有這么一個"記憶"類的比賽游戲。你和電腦對戰。輪到誰的回合,誰翻兩張牌。假設兩張牌一樣,就消掉這兩張牌,得2分,能夠繼續翻牌。假設兩張牌不一樣,就換一個人。
直到最后,看誰的得分高。
先把圖畫出來會清晰些:
2.先看下不好的設計方式
我們來設計游戲大致架構。用一個圈表示一個狀態。
typedef enum{WaitingPlayer,CheckPlayer,AIThink,AIFirstCard,AISecondCard,CheckAI }MatchGameState;
準備一個_state的變量來記錄當前的狀態,然后放到update函數里,運行以下的偽代碼。
_state = CheckAI; break; case CheckAI: if(AICard1 == AICard2){ _state = AIThink; 電腦得分 }else{ _state = WaitingPlayer; } } }
這樣寫是能夠,可是隨著代碼行數增加和業務邏輯變得復雜,興許會比較難維護。
3.使用"設計模式"來重構
我們來看下怎樣重構,使用"設計模式"來重構它。我盜了一張圖來說明。
不知道這方法是設計模式中的哪種。
我們打算把全部的狀態都用一個類來實現,它們都繼承一個基類叫MatchState,它很easy。
有一個類來管理全部的狀態。
MatchState例如以下:
#ifndef _MATCHSTATE_ #define _MATCHSTATE_class MatchState{public:virtual void Update() = 0;};#endif
我這里就沒加OnEnter和OnExit了。簡單起見。
為了簡單些。就把Layer作為狀態管理類,在Layer中增加一個屬性,來表示當前狀態:
MatchState* currentState;在基本的Layer中增加一個方法來切換當前狀態:
void changeState(MatchState* state){delete currentState;currentState = state; }在update中就簡單了,一直運行當前狀態的Update方法:
每一個狀態的詳細業務邏輯都寫在自己的類中。
比方WaitingPlayerState類:
#ifndef _WAITINGPLAYERSTATE_H #define _WAITINGPLAYERSTATE_H#include "MatchState.h"class WaitingPlayerState : public MatchState{ public:WaitingPlayerState(){}void Update(){if(sGlobal->cardCount == 2){sGlobal->matchLayer->changeState(new CheckPlayerCardsState());}} };#endif
這里sGlobal是一個單例。
再比方CheckPlayerCardsState:
#ifndef _CHECKPLAYERCARDSSTATE_H #define _CHECKPLAYERCARDSSTATE_H#include "MatchState.h"class CheckPlayerCardsState : public MatchState { public:void Update(){//很復雜的詳細業務邏輯寫在這里if(playerCard1 == playerCard2){玩家得分sGlobal->matchLayer->changeState(new WaitingPlayerState ());}else{sGlobal->matchLayer->changeState(new AIThinkState ());把玩家點開的卡增加到記憶數組中}}};#endif
其它狀態類就不寫出來了,總之通過這樣把一個狀態用一個類來表示,大大的使代碼簡潔些,擴展性強些。
http://www.waitingfy.com/archives/1273
轉載于:https://www.cnblogs.com/gcczhongduan/p/5135509.html
總結
以上是生活随笔為你收集整理的Cocos2d 游戏状态机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gitlab服务器搭建
- 下一篇: 1-4 物理层