加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

Cocos2d 游戏状态机的更多相关文章

  1. cocos2d 游戏开发实战

    文章转自:http://uliweb.clkg.org/tutorial/read/40 6   cocos2d 游戏开发实战 6.1   创建cocos2d项目 6.2   cocos2d v3 & ...

  2. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  3. 如何在Cocos2D游戏中实现A*寻路算法(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  4. cocos2d游戏jsc文件格式解密,SpideMonkey大冒险

    “ 介绍cocos2d游戏中常用的jsc格式文件的解密.” 01 — 在破解游戏应用中,经常会碰到后缀为jsc的文件,这是基于cocos2d开发的游戏的加密代码,本质上是js文件,只是被加密了. 例如 ...

  5. iOS cocos2d游戏引擎的了解之一

    ios游戏引擎之Cocos2d(一) cocos2d是一个免费开源的ios游戏开发引擎,并且完全采用object-c进行编写,这对于已经用惯object-c进行ios应用开发的童鞋来说非常容易上手.这 ...

  6. 《黑马程序猿》 cocos2d游戏引擎复习笔记一

    /** ----------------------------游戏场景的搭建-------------------------------- 1首先创建一个surfaceview ,它能够在子线程中 ...

  7. 如何在Cocos2D游戏中实现A*寻路算法(八)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  8. 如何在Cocos2D游戏中实现A*寻路算法(四)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  9. 如何在Cocos2D游戏中实现A*寻路算法(二)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

随机推荐

  1. 怎样更好的设计android图标,拉伸不变形等等系列长处,并且减小apk大小

    android mvp框架:dileber(https://github.com/dileber/dileber.git) 继续为大家介绍android mvp开源框架 dileber  今天主要是字 ...

  2. AES加密解密&&SHA1、SHA加密&&MD5加密

    AES加密解密 SHA1.SHA加密 MD5加密 二话不说立即附上代码: package com.luo.util; import java.io.UnsupportedEncodingExcepti ...

  3. DuiVision开发教程(19)-菜单

    DuiVision菜单类是CDuiMenu.有两种显示的位置,一种是在窗体顶部某个button点击后能够下拉一个菜单,还有一种是托盘图标的右键菜单. 窗体中的菜单定义方式是xml文件里设置某个butt ...

  4. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  5. Elasticsearch之marvel(集群管理、监控)插件安装之后的浏览详解

    前提 Elasticsearch之插件介绍及安装 https://i.cnblogs.com/posts?categoryid=950999&page=2  (强烈建议,从头开始看) 比如,我 ...

  6. Linux下使用SSH、Crontab、Rsync三工具实现数据自动备份

    Linux下使用SSH.Crontab.Rsync三工具实现数据自动备份 作为网管人员大概都无一例外的经历过系统备份,尤其是重要系统的备份.重要数据库系统的备份工作.由于备份是个频繁而琐碎的工作,如何 ...

  7. C#开发 —— 泛型,文件

    泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构 —— 参数化 泛型能子啊编译时提供强大的类型检查,减少数据类型之间的显式转换,装箱操作和运行时的类型检查 泛型的类型参数T可以被看作是一个 ...

  8. python3 import Crypto 失败的解决办法 (AES对称加密使用 模块)

    # 先导入所需要的包 pip3 install Crypto # 再安装pycrypto pip3 install pycrypto from Crypto.Cipher import AES # 就 ...

  9. CMDB学习之一

    CMDB - 配置管理数据库 资产管理 自动化相关的平台(基础 CMDB): 1. 发布系统 2. 监控 3. 配管系统.装机 4. 堡垒机 CMDB的目的: 1. 替代EXCEL资产管理 —— 资产 ...

  10. php7 兼容 MySQL 相关函数

    php7 兼容 MySQL 相关函数 PHP7 废除了 ”mysql.dll” ,推荐使用 mysqli 或者 pdo_mysql http://PHP.net/manual/zh/mysqlinfo ...