cocos2d-x 游戏开发之有限状态机(FSM) (三)
cocos2d-x 游戏开发之有限状态机(FSM) (三)
有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态。然后Monkey类就实现了行为与状态分离。Monkey类只负责自己的行为,MonkeyFSM作为Monkey的成员,负责状态调度。MonkeyFSM调用状态模式类的方法,状态模式类调用真实对象Monkey的方法。注意本文例子代码只是为了说明问题,并不能真正用于实际当中。其中Monkey与MonkeyFSM互相保存对方的指针,存在循环引用问题。
代码部分:
MonkeyFSM:
- // MonkeyFSM.h
- //
- #ifndef MONKEY_FSM_H_
- #define MONKEY_FSM_H_
- #include "cocos2d.h"
- USING_NS_CC;
- #include "State.h"
- class Monkey;
- class MonkeyFSM
- : public Node
- {
- public:
- MonkeyFSM()
- {
- _monkey = 0;
- _state = 0;
- log("MonkeyFSM()");
- }
- static MonkeyFSM * createObject(Monkey * mk)
- {
- MonkeyFSM * fsm = new MonkeyFSM();
- fsm->initWithMonkey(mk);
- return fsm;
- }
- bool initWithMonkey(Monkey * mk)
- {
- _monkey = mk;
- return true;
- }
- void changeState(State * newState)
- {
- State * oldState = _state;
- _state = newState;
- if (oldState) {
- delete oldState;
- }
- }
- virtual void update(float dt)
- {
- if (_state) {
- _state->execute(_monkey);
- }
- }
- private:
- State * _state;
- Monkey * _monkey;
- };
- #endif // MONKEY_FSM_H_
Monkey:
- #ifndef MONKEY_H_
- #define MONKEY_H_
- #include <time.h>
- #include "cocos2d.h"
- USING_NS_CC;
- #include "MonkeyFSM.h"
- #define MAX_STOP_TIME 10
- #define MAX_WALK_TIME 20
- #define MAX_WALK_DIST 100
- class Monkey
- : public Node
- {
- public:
- Monkey()
- {
- log("Monkey()");
- }
- CREATE_FUNC(Monkey);
- virtual bool init()
- {
- _curPos = 0;
- _step = 1;
- _fsm = MonkeyFSM::createObject(this);
- this->scheduleUpdate();
- return true;
- }
- void stop()
- {
- cocos2d::log("stop()");
- }
- void walk()
- {
- _curPos += _step;
- cocos2d::log("walk(): pos=%d", _curPos);
- }
- void turn()
- {
- _step *= -1;
- cocos2d::log("turn(): step=%d", _step);
- }
- MonkeyFSM * getFSM()
- {
- return _fsm;
- }
- void update(float dt)
- {
- if (_fsm) {
- _fsm->update(dt);
- }
- }
- private:
- MonkeyFSM * _fsm;
- time_t _curTime;
- int _curPos;
- int _step;
- public:
- bool isStopTimeout()
- {
- return (time(0) - _curTime > MAX_STOP_TIME);
- }
- bool isWalkTimeout()
- {
- return (time(0) - _curTime > MAX_WALK_TIME);
- }
- bool isWalkOutBorder()
- {
- return (_curPos > MAX_WALK_DIST || _curPos < -MAX_WALK_DIST);
- }
- };
- #endif // MONKEY_H_
状态模式类,.h文件没有变化:
- // State.h
- //
- #ifndef STATE_H_
- #define STATE_H_
- class Monkey;
- struct State
- {
- virtual void execute(Monkey *mk) = 0;
- };
- #endif // STATE_H_
- // WalkState.h
- //
- #ifndef WALK_STATE_H_
- #define WALK_STATE_H_
- #include "State.h"
- #include "Monkey.h"
- class WalkState
- : public State
- {
- public:
- virtual void execute(Monkey *mk);
- };
- #endif // WALK_STATE_H_
- // WalkState.cpp
- //
- #include "WalkState.h"
- #include "TurnState.h"
- #include "StopState.h"
- void WalkState::execute(Monkey *mk)
- {
- mk->walk();
- if (mk->isWalkOutBorder()) {
- mk->getFSM()->changeState(new TurnState());
- mk->turn();
- } else if (mk->isWalkTimeout()) {
- mk->getFSM()->changeState(new StopState());
- mk->stop();
- }
- }
cocos2d-x 游戏开发之有限状态机(FSM) (三)的更多相关文章
- cocos2d-x 游戏开发之有限状态机(FSM) (一)
cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...
- cocos2d-x 游戏开发之有限状态机(FSM) (二)
cocos2d-x 游戏开发之有限状态机(FSM) (二) 1 状态模式
- iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
- java游戏开发杂谈 - 有限状态机
在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...
- HTML5物理游戏开发 - 越野山地自行车(三)粉碎自行车
自上一章公布到如今已时隔四月,实在对不住大家.让大家久等了~话说不是我不关注我的博客,而是事情一多起来写博客的时间就少了. 待到今日有空了,回头看了看自己曾经写的文章,猛得发现已经四个月不曾写文章了. ...
- 【Unity游戏开发】跟着马三一起魔改LitJson
一.引子 在游戏开发中,我们少不了和数据打交道,数据的存储格式可谓是百花齐放,xml.json.csv.bin等等应有尽有.在这其中Json以其小巧轻便.可读性强.兼容性好等优点受到广大程序员的喜爱. ...
- Unity3D游戏开发从零单排(三) - 极速创建狂拽酷炫的游戏地形
提要 在Unity工作流程内,地形是一个必不可少的重要元素.不论是游戏或虚拟现实都会使用到各种类型的地形效果,在这个教学中我们须要了解到地形的制作基本概念与,当中对于Unity的地形操作部分须要大量的 ...
- DirectX12 3D 游戏开发与实战第三章内容
变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ...
随机推荐
- linux 防火墙操作
root/12345 (只能用ROOT操作)iptables -I INPUT -s x.x.x.x -p tcp --dport 8091 -j ACCEPT #允许x.x.x.x访问本机的80 ...
- (Java)微信之个人公众账号开发(一)——进入开发者模式
本篇文章将教大家如何建立微信个人公众账号,(注意:后台全部是用javaweb相关技术开发),大家知道,现在微信公众账号分服务号和订阅号,现在我要讲的主要是个人微信公众账号的建立以及后台的开发,个人公众 ...
- JavaEE介绍
相关术语 为什么需要JavaEE 我们编写的JSP代码中,由于大量的显示代码和业务逻辑混淆在一起,彼此嵌套,不利于程序的维护和扩展.当业务需求发生变化的时候,对于程序员和美工都是一个很重的负担.为了程 ...
- JVM基础知识GC
在网上看到一篇很不错的讲解JVM GC的文章,看完之后觉得可以留着以后多看几遍便转载了下来.但是找了半天也没有找到原作者地址.抱歉不能标明原文地址了.以下是文章内容. 几年前写过一篇关于JVM调优的文 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- Spark技术内幕:Executor分配详解
当用户应用new SparkContext后,集群就会为在Worker上分配executor,那么这个过程是什么呢?本文以Standalone的Cluster为例,详细的阐述这个过程.序列图如下: 1 ...
- leetcode 37. Sudoku Solver 36. Valid Sudoku 数独问题
三星机试也考了类似的题目,只不过是要针对给出的数独修改其中三个错误数字,总过10个测试用例只过了3个与世界500强无缘了 36. Valid Sudoku Determine if a Sudoku ...
- UNIX网络编程——使用线程的TCP回射服务器程序
同一进程内的所有线程除了共享全局变量外还共享: (1)进程指令: (2)大多数数据: (3) 打开的文件(即描述符): (4)信号处理函数和信号处置: (5)当前工作目录: (6)用户ID和组ID. ...
- 怎么对MySQL数据库操作大数据?这里有思路
最近学到一招关于使用java代码操作MySQL数据库,对大文本数据(LOB)进行CRUD的技巧,虽然向数据库很少向中存入大文本文件(一般都是存储在硬盘上),但是还是很有必要知道这一技巧的.下面我就来说 ...
- INV_TXN_MANAGER_PUB.PROCESS_TRANSACTIONS
For Interface Transactions,INV_TXN_MANAGER_PUB.PROCESS_TRANSACTIONS DOES below things: 1)validate_gr ...