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 游戏开发与实战第三章内容
变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ...
随机推荐
- Android图表库MPAndroidChart(十四)——在ListView种使用相同的图表
Android图表库MPAndroidChart(十四)--在ListView种使用相同的图表 各位好久不见,最近挺忙的,所有博客更新的比较少,这里今天说个比较简单的图表,那就是在ListView中使 ...
- 动手试试Android Studio插件开发
由于业务关系,经常需要写一些表单页面,基本也就是简单的增删改查然后上传,做过几个页面之后就有点想偷懒了,这么低水平重复性的体力劳动,能不能用什么办法自动生成呢,查阅相关资料,发现android stu ...
- 使用Contacts Contract Content Provider操作通讯录最佳实践
Android向所有被赋予READ_CONTACTS权限的应用程序提供了联系人信息数据库的完全访问权限.Contacts Contract使用3层数据模型去存储数据,下面介绍Contacts Cont ...
- SpriteKit中为何不要在update方法中测试碰撞
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们若要在游戏中做碰撞检测有2种办法,一是利用物理引擎,二是自 ...
- 带你深入理解STL之Set和Map
在上一篇博客带你深入理解STL之RBTree中,讲到了STL中关于红黑树的实现,理解起来比较复杂,正所谓前人种树,后人乘凉,RBTree把树都种好了,接下来就该set和map这类关联式容器来" ...
- Android 系统自动重启Bug(高通平台)
点击打开链接 最近客户反馈了一个Bug,我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据老大和高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹: ...
- VS2008界面语言设置
在卸载某个软件的时候,不知道什么原因导致vs2008的界面变成中文的了,但是菜单还是英文的,很不美观. 几经查找,最后可以在如下的地方设置界面语言 Tools -> Options 如果设置成 ...
- 高通msm8994性能及温度监测脚本
[plain] view plain copystartTime=$(date +%Y-%m-%d-%H-%M-%S) pathName="/data/cpu_logs" fi ...
- SQL Server SA 最佳实践(也许不仅仅是翻译)
老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我 ...
- [django]添加自定义template filter标签
看文档templatetag 直接放在app下的templatetag 文件夹下就好,这里想放到一个公共的目录下,然后写下简单的自定义tag的模板. django1.6 创建 在项目目录下建立如下的文 ...