cocos2d-x 游戏开发之有限状态机(FSM) (三)

有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态。然后Monkey类就实现了行为与状态分离。Monkey类只负责自己的行为,MonkeyFSM作为Monkey的成员,负责状态调度。MonkeyFSM调用状态模式类的方法,状态模式类调用真实对象Monkey的方法。注意本文例子代码只是为了说明问题,并不能真正用于实际当中。其中Monkey与MonkeyFSM互相保存对方的指针,存在循环引用问题。

代码部分:

MonkeyFSM:

  1. // MonkeyFSM.h
  2. //
  3. #ifndef MONKEY_FSM_H_
  4. #define MONKEY_FSM_H_
  5.  
  6. #include "cocos2d.h"
  7. USING_NS_CC;
  8.  
  9. #include "State.h"
  10. class Monkey;
  11.  
  12. class MonkeyFSM
  13. : public Node
  14. {
  15. public:
  16. MonkeyFSM()
  17. {
  18. _monkey = 0;
  19. _state = 0;
  20.  
  21. log("MonkeyFSM()");
  22. }
  23.  
  24. static MonkeyFSM * createObject(Monkey * mk)
  25. {
  26. MonkeyFSM * fsm = new MonkeyFSM();
  27. fsm->initWithMonkey(mk);
  28. return fsm;
  29. }
  30.  
  31. bool initWithMonkey(Monkey * mk)
  32. {
  33. _monkey = mk;
  34.  
  35. return true;
  36. }
  37.  
  38. void changeState(State * newState)
  39. {
  40. State * oldState = _state;
  41. _state = newState;
  42.  
  43. if (oldState) {
  44. delete oldState;
  45. }
  46. }
  47.  
  48. virtual void update(float dt)
  49. {
  50. if (_state) {
  51. _state->execute(_monkey);
  52. }
  53. }
  54.  
  55. private:
  56. State * _state;
  57.  
  58. Monkey * _monkey;
  59. };
  60.  
  61. #endif // MONKEY_FSM_H_

Monkey:

  1. #ifndef MONKEY_H_
  2. #define MONKEY_H_
  3.  
  4. #include <time.h>
  5.  
  6. #include "cocos2d.h"
  7. USING_NS_CC;
  8.  
  9. #include "MonkeyFSM.h"
  10.  
  11. #define MAX_STOP_TIME 10
  12. #define MAX_WALK_TIME 20
  13.  
  14. #define MAX_WALK_DIST 100
  15.  
  16. class Monkey
  17. : public Node
  18. {
  19. public:
  20. Monkey()
  21. {
  22. log("Monkey()");
  23. }
  24.  
  25. CREATE_FUNC(Monkey);
  26.  
  27. virtual bool init()
  28. {
  29. _curPos = 0;
  30. _step = 1;
  31.  
  32. _fsm = MonkeyFSM::createObject(this);
  33.  
  34. this->scheduleUpdate();
  35.  
  36. return true;
  37. }
  38.  
  39. void stop()
  40. {
  41. cocos2d::log("stop()");
  42. }
  43.  
  44. void walk()
  45. {
  46. _curPos += _step;
  47. cocos2d::log("walk(): pos=%d", _curPos);
  48. }
  49.  
  50. void turn()
  51. {
  52. _step *= -1;
  53. cocos2d::log("turn(): step=%d", _step);
  54. }
  55.  
  56. MonkeyFSM * getFSM()
  57. {
  58. return _fsm;
  59. }
  60.  
  61. void update(float dt)
  62. {
  63. if (_fsm) {
  64. _fsm->update(dt);
  65. }
  66. }
  67.  
  68. private:
  69. MonkeyFSM * _fsm;
  70.  
  71. time_t _curTime;
  72.  
  73. int _curPos;
  74. int _step;
  75.  
  76. public:
  77. bool isStopTimeout()
  78. {
  79. return (time(0) - _curTime > MAX_STOP_TIME);
  80. }
  81.  
  82. bool isWalkTimeout()
  83. {
  84. return (time(0) - _curTime > MAX_WALK_TIME);
  85. }
  86.  
  87. bool isWalkOutBorder()
  88. {
  89. return (_curPos > MAX_WALK_DIST || _curPos < -MAX_WALK_DIST);
  90. }
  91. };
  92.  
  93. #endif // MONKEY_H_

状态模式类,.h文件没有变化:

  1. // State.h
  2. //
  3. #ifndef STATE_H_
  4. #define STATE_H_
  5.  
  6. class Monkey;
  7.  
  8. struct State
  9. {
  10. virtual void execute(Monkey *mk) = 0;
  11. };
  12.  
  13. #endif // STATE_H_

  1. // WalkState.h
  2. //
  3. #ifndef WALK_STATE_H_
  4. #define WALK_STATE_H_
  5.  
  6. #include "State.h"
  7. #include "Monkey.h"
  8.  
  9. class WalkState
  10. : public State
  11. {
  12. public:
  13. virtual void execute(Monkey *mk);
  14. };
  15.  
  16. #endif // WALK_STATE_H_

  1. // WalkState.cpp
  2. //
  3. #include "WalkState.h"
  4. #include "TurnState.h"
  5. #include "StopState.h"
  6.  
  7. void WalkState::execute(Monkey *mk)
  8. {
  9. mk->walk();
  10.  
  11. if (mk->isWalkOutBorder()) {
  12. mk->getFSM()->changeState(new TurnState());
  13. mk->turn();
  14. } else if (mk->isWalkTimeout()) {
  15. mk->getFSM()->changeState(new StopState());
  16. mk->stop();
  17. }
  18. }

cocos2d-x 游戏开发之有限状态机(FSM) (三)的更多相关文章

  1. cocos2d-x 游戏开发之有限状态机(FSM) (一)

    cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...

  2. cocos2d-x 游戏开发之有限状态机(FSM) (四)

    cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...

  3. cocos2d-x 游戏开发之有限状态机(FSM) (二)

    cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式

  4. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  5. java游戏开发杂谈 - 有限状态机

    在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...

  6. HTML5物理游戏开发 - 越野山地自行车(三)粉碎自行车

    自上一章公布到如今已时隔四月,实在对不住大家.让大家久等了~话说不是我不关注我的博客,而是事情一多起来写博客的时间就少了. 待到今日有空了,回头看了看自己曾经写的文章,猛得发现已经四个月不曾写文章了. ...

  7. 【Unity游戏开发】跟着马三一起魔改LitJson

    一.引子 在游戏开发中,我们少不了和数据打交道,数据的存储格式可谓是百花齐放,xml.json.csv.bin等等应有尽有.在这其中Json以其小巧轻便.可读性强.兼容性好等优点受到广大程序员的喜爱. ...

  8. Unity3D游戏开发从零单排(三) - 极速创建狂拽酷炫的游戏地形

    提要 在Unity工作流程内,地形是一个必不可少的重要元素.不论是游戏或虚拟现实都会使用到各种类型的地形效果,在这个教学中我们须要了解到地形的制作基本概念与,当中对于Unity的地形操作部分须要大量的 ...

  9. DirectX12 3D 游戏开发与实战第三章内容

    变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ...

随机推荐

  1. linux 防火墙操作

    root/12345 (只能用ROOT操作)iptables -I INPUT -s x.x.x.x -p tcp --dport 8091 -j ACCEPT   #允许x.x.x.x访问本机的80 ...

  2. (Java)微信之个人公众账号开发(一)——进入开发者模式

    本篇文章将教大家如何建立微信个人公众账号,(注意:后台全部是用javaweb相关技术开发),大家知道,现在微信公众账号分服务号和订阅号,现在我要讲的主要是个人微信公众账号的建立以及后台的开发,个人公众 ...

  3. JavaEE介绍

    相关术语 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担.为了程 ...

  4. JVM基础知识GC

    在网上看到一篇很不错的讲解JVM GC的文章,看完之后觉得可以留着以后多看几遍便转载了下来.但是找了半天也没有找到原作者地址.抱歉不能标明原文地址了.以下是文章内容. 几年前写过一篇关于JVM调优的文 ...

  5. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  6. Spark技术内幕:Executor分配详解

    当用户应用new SparkContext后,集群就会为在Worker上分配executor,那么这个过程是什么呢?本文以Standalone的Cluster为例,详细的阐述这个过程.序列图如下: 1 ...

  7. leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题

    三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...

  8. UNIX网络编程——使用线程的TCP回射服务器程序

    同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3)  打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...

  9. 怎么对MySQL数据库操作大数据?这里有思路

    最近学到一招关于使用java代码操作MySQL数据库,对大文本数据(LOB)进行CRUD的技巧,虽然向数据库很少向中存入大文本文件(一般都是存储在硬盘上),但是还是很有必要知道这一技巧的.下面我就来说 ...

  10. INV_TXN_MANAGER_PUB.PROCESS_TRANSACTIONS

    For Interface Transactions,INV_TXN_MANAGER_PUB.PROCESS_TRANSACTIONS DOES below things: 1)validate_gr ...