加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 游戏状态机相关推荐

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

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍cocos2d游戏中常用的jsc格式文件的解密." 01 - 在破解游戏应用中,经常会碰到后缀为jsc的文件,这是基于coco ...

  2. [转]cocos2d游戏开发,常用工具集合

    cocos2d游戏开发,常用工具集合 原文地址:http://www.cocoachina.com/bbs/read.php?tid-68951.html 位图字体工具Bitmap Font Tool ...

  3. python 游戏引擎 cocos2d_2.2 完成一个Cocos2d游戏程序代码

    本视频基于**Python 3.6版本 Python语言之所以受欢迎,很大的原因是有很多可以使用的库,Python社区也有很多游戏开发库,其中较为优秀有:Cocos2d.Pyglet和Pygame,还 ...

  4. android图片资源加密解密,[原创]cocos2d游戏图片资源解密

    0x00 序 之前遇到过一个有意思的cocos2d游戏.里面的图片资源全都加密了.今天突然想起来.整理一下发出来. 0x01 开干 ak 打开软件 发现是cococs游戏,并且资源文件里面全是mp3, ...

  5. Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源

    Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源 在大部分时候,Cocos2d游戏会将美术资源打包以减轻性能要求,提高加载速度.而如果我们需要获得其中的美术资源,就得解包.这里以plis ...

  6. 初学者开发iOS游戏的入门必备用书——iOS 5 cocos2d游戏开发实战(第2版)

    如果想接触iOS游戏开发,今天笔者就推荐一本"大杀器"--<iOS 5 cocos2d游戏开发实战(第2版)>(当当链接) 为零基础的"设想过自己写个电脑游戏 ...

  7. 图文并茂使用CocosBuilder制作Cocos2D游戏 分享0

    图文并茂使用CocosBuilder制作Cocos2D游戏  分享0 目 录 The Game 设置工程 创建动画类型的主界面 本文由Zynga 工程师原创,翻译:Iven,张作宸,Butterfly ...

  8. cocos-2d 游戏开发

    利用cocos-2d游戏引擎进行简单的游戏开发 levelLayer.java package Layer;import android.graphics.Point; import android. ...

  9. iOS 5 cocos2d游戏开发实战(第2版)

    <iOS 5 cocos2d游戏开发实战(第2版)> 基本信息 作者: [美]Steffen Itterheim Andreas Low [作译者介绍] 译者: 同济大学苹果俱乐部 丛书名 ...

最新文章

  1. 以赛促学,飞桨助力大学生智能车竞赛升级
  2. DPDK vhost-user之前后端通知机制场景分析(十)
  3. 知识在于积累和分类,厚积薄发
  4. OpenCV Laplace point/edge detection拉普拉斯点/边缘检测的实例(附完整代码)
  5. lol游戏挂机软件_六小时封停警告!lol手游海外服挂机惩罚力度太大引玩家吐槽...
  6. windows10下安装JDK及环境变量设置
  7. 【编译】StreamInsight简介
  8. qml: 自定义滚动条;
  9. 博文视点大讲堂第6、7期开课
  10. 如何养成好的Linux操作习惯
  11. 软件工程导论 银行储蓄系统_银行储蓄系统.ppt
  12. java mvc外文文献_java spring英文文献和中文翻译
  13. 2021-04-12——新特性Lambda表达式和Function函数式接口编程
  14. 抖音企业号抖音智能营销系统源码待开发技术。。。。。
  15. 控制Unity中脚本的运行顺序
  16. Android Studio Chipmunk 发布啦,快来看看有什么更新
  17. 第三方软件测试(软件检测)收费标准
  18. 发那科系统梯形图实例,重点是带中文注释
  19. 网站内链优化,网站内部链接优化
  20. HijackThis日志细解【简明教程增强版】(一)

热门文章

  1. dev grid把一列通过选择框进行编辑
  2. Vue - class与style绑定
  3. Repeater嵌套绑定Repeater[转]
  4. Gnome Subtitles:字幕编辑器
  5. 【转】从网页上下载控件时制作CAB包的方法
  6. 二叉树后续遍历非递归
  7. linux进程--fork详解(三)
  8. leetcode算法题--零钱兑换
  9. HDMI和VGA接口
  10. Linux运维工程师面试题第二套