cocos2d-x 游戏开发之有限状态机(FSM) (二)
cocos2d-x 游戏开发之有限状态机(FSM) (二)
1 状态模式
State是状态基类。它其实是一个接口,它有3个实现类,分别对应每个状态。Monkey类只需要维护State类,而具体的行为通过3个实现类完成。这就是多态。下面是完整的代码:
2 状态基类
// State.h
//
#ifndef STATE_H_
#define STATE_H_
class Monkey;
struct State
{
virtual void execute(Monkey *mk) = 0;
};
#endif // STATE_H_
3 实现类
3.1 StopState
// StopState.h
//
#ifndef STOP_STATE_H_
#define STOP_STATE_H_
#include "State.h"
#include "Monkey.h"
class StopState
: public State
{
public:
virtual void execute(Monkey *mk);
};
#endif // STOP_STATE_H_
// StopState.cpp
//
#include "StopState.h"
#include "WalkState.h"
void StopState::execute(Monkey *mk)
{
if (mk->isStopTimeout()) {
mk->changeState(new WalkState());
mk->walk();
}
}
3.2 WalkState
// 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->changeState(new TurnState());
mk->turn();
} else if (mk->isWalkTimeout()) {
mk->changeState(new StopState());
mk->stop();
}
}
3.3 TurnState
// TurnState.h
//
#ifndef TURN_STATE_H_
#define TURN_STATE_H_
#include "State.h"
#include "Monkey.h"
class TurnState
: public State
{
public:
virtual void execute(Monkey *mk);
};
#endif // TURN_STATE_H_
// TurnState.cpp
//
#include "TurnState.h"
#include "WalkState.h"
void TurnState::execute(Monkey *mk)
{
mk->changeState((State*) new WalkState());
mk->walk();
}
4 Monkey
#ifndef MONKEY_H_
#define MONKEY_H_
#include <time.h>
#include "cocos2d.h"
USING_NS_CC;
#include "State.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;
_curState = 0;
this->scheduleUpdate();
return true;
}
void changeState(State * newState)
{
State * oldState = _curState;
_curState = newState;
if (oldState) {
delete oldState;
}
_curTime = time(0);
}
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);
}
void update(float dt)
{
if (_curState) {
_curState->execute(this);
}
}
private:
State * _curState;
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_
5 总结
当我们需要添加了一种新的状态时,不需要去修改长长的条件判断语句了,只需要构造一个新的状态类,修改它的前序和后序状态类就可以了。对于任何一个状态的特有行为,都是独立的,不会混杂在其它状态的代码里。原为决定状态转移逻辑的那个长长的条件语句不见了,而是被分布在State的子类之间。另一方面,从设计的角度看,原先对当前状态的标识,是FSM内部的一个自有变量,状态与状态之间的转换也仅仅是表现为对自有变量的赋值,如果这个自有变量衍生为变量数组时,那极易出现FSM内部状态不一致的情况,而State的引入可以使得这样的情况变得相当简单。对于新版本的FSM来说,状态与状态之间的转换也成了原子化的操作,不需要兼顾多个变量的赋值。
既然所有状态机具有同样的规则和范式,那么状态机应该与具体对象无关,完全可以提炼出纯粹的状态机类来管理任何对象的状态。下节就完成这个任务。
cocos2d-x 游戏开发之有限状态机(FSM) (二)的更多相关文章
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...
- cocos2d-x 游戏开发之有限状态机(FSM) (三)
cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monk ...
- cocos2d-x 游戏开发之有限状态机(FSM) (一)
cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...
- iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
- java游戏开发杂谈 - 有限状态机
在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...
- (转载)如何学好iphone游戏开发
转自:http://www.cnblogs.com/zilongshanren/archive/2011/09/19/2181558.html 自从发布<如何学习iphone游戏开发>到 ...
- 整理了一下浅墨大神的Visual C++/DirectX 9.0c的游戏开发手记
还是非常棒的博客,只是没有一个文件夹.所以自己做了一个山寨文件夹在这里.便于随时查找. 前面31期从略. [Visual C++]游戏开发笔记三十二 浅墨DirectX提高班之中的一个 DirectX ...
- HTML5物理游戏开发 - 越野山地自行车(三)粉碎自行车
自上一章公布到如今已时隔四月,实在对不住大家.让大家久等了~话说不是我不关注我的博客,而是事情一多起来写博客的时间就少了. 待到今日有空了,回头看了看自己曾经写的文章,猛得发现已经四个月不曾写文章了. ...
随机推荐
- Cassandra 3.x官方文档(1)---关于Cassandra
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- 前端CSS技术全解(二)
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52813761 本文出自:[余志强的博客] 一.CSS三大特性 1)继 ...
- PGM:不完备数据的参数估计
http://blog.csdn.net/pipisorry/article/details/52626889 使用不完备数据的贝叶斯学习:MLE估计(梯度上升和EM算法).贝叶斯估计. 表示:H[m ...
- Android中GridView的一些特殊属性
GridView的一些特殊属性: 1.android:numColumns="auto_fit" //GridView的列数设置为自动 2.android:columnWidt ...
- activiti实战系列 排他网关(ExclusiveGateWay)
流程图 12.2:部署流程定义+启动流程实例 12.3:查询我的个人任务 12.4:完成我的个人任务 说明: 1) 一个排他网关对应一个以上的顺序流 2) 由排他网关流出的顺序流都有个 ...
- [tornado]websocket 最简单demo
想法 前两天想看看django 长轮询或者是websocket的方案,发现都不太好使. tornado很适合做这个工作,于是找了些资料,参照了做了个最简单demo,以便备用. 具体的概念就不说了,to ...
- EXCEL技能之数据去重
本篇不属于技术类博文,只是想找个地方记录而已,既然是我的博客嘛,那就自己想写什么就写什么了. CRM中有个EXCEL数据导入功能,几千条数据导入CRM后去重,那是死的心都有的.往回想想EXCEL是否有 ...
- 16 Content Provider总结
第16天 Content Provider 一, 什么是Content Provider? 内容提供者 Android四大主件之一 :短信记录 通讯录 联系人 自定义 >Content Prov ...
- [ExtJS5学习笔记]第二十四节 Extjs5中表格gridpanel或者表单数据后台传输remoteFilter设置
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39667533 官方文档:http://docs.sencha.com/extjs/5. ...
- 安卓服务Service详解
service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与Activity一样,它存在自己的生命周期,也需要在清单文件中配置相关信息,本博客将对Service的各个知识点进行详细 ...