日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cocos2d 游戏状态机

發布時間:2025/7/25 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cocos2d 游戏状态机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

加cocos2d 是標題黨。

事實上跟cocos2d無關。

1.游戲背景介紹



比方有這么一個"記憶"類的比賽游戲。你和電腦對戰。輪到誰的回合,誰翻兩張牌。假設兩張牌一樣,就消掉這兩張牌,得2分,能夠繼續翻牌。假設兩張牌不一樣,就換一個人。

直到最后,看誰的得分高。

先把圖畫出來會清晰些:


2.先看下不好的設計方式


我們來設計游戲大致架構。用一個圈表示一個狀態。

typedef enum{WaitingPlayer,CheckPlayer,AIThink,AIFirstCard,AISecondCard,CheckAI }MatchGameState;

準備一個_state的變量來記錄當前的狀態,然后放到update函數里,運行以下的偽代碼。


void MatchLayer::update(float dt){if(allCards.size() == 0){_state = GameOver;}switch(_state){case WaitingPlayer:if(cardCount == 2){_state = CheckPlayer;cardCount = 0;}break;case CheckPlayer:if(playerCard1 == playerCard2){玩家得分_state = WaitingPlayer;}else{_state = AIThink;把玩家點開的卡增加到記憶數組中}break;case AIThink:從記憶的數組中找兩張同樣的,找不到就隨機準備兩種卡_state = AIFirstCard;break;case AIFirstCard:點開第一張卡假設之前沒找到同樣卡。把這卡增加到記憶數組_state = AISecondCard;break;case AISecondCard:從記憶的數組中找兩張同樣的:假設找到跟第一張一樣,就點開它,找不到就點剛開始的隨機第2張,而且把第2張增加到記憶數組中。

_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方法:


void MatchLayer::update(float dt){if(allCards.size() == 0){_state = GameOver;}currentState->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 游戏状态机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。