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