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简易实战教程--第三十五话《音乐播放》
已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...
- 【SSH系列】Hibernate映射-- 多对一单向关联映射
在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型 ...
- 剑指Offer——知识点储备-常用算法
剑指Offer--知识点储备-常用算法 快速排序 注:若排序是有序的,采用快排,则退化为冒泡排序. 解决这个问题,采用两个选取基准的方法 (1)随机选取基数(在这个区间内随机取一个数) 出现的恶劣情况 ...
- 微信小程序基本组件概述
为了更好的理解微信小程序,本文90%文字描述来源于官网的介绍.官网原链接https://mp.weixin.qq.com/debug/wxadoc/dev/component/?t=20161222 ...
- chromium出现输入密码解锁登录密钥环
chromium出现输入密码解锁登录密钥环 在ubuntu 16.04上安装了Chromium出现对话框,如下所示: 因为密码框截图困难,这个是网上图片. 点取消就可以使用,但是每次都这样很烦,百度后 ...
- 【Unity Shader】2D动态云彩
写在前面 赶在年前写一篇文章.之前翻看2015年的SIGGRAPH Course(关于渲染的可以去selfshadow的博客里找到,很全)的时候看到了关于体积云的渲染.这个课程讲述了开发者为游戏< ...
- iOS中NSTimer的invalidate调用之后
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...
- Dynamics CRM 通过RetrieveEntityRibbonRequest和RetrieveApplicationRibbonRequest导出实体的Ribbon XML
今天看到勇哥的博客介绍了两个request指令用来导出实体的Ribbon XML,在没有工具之前编辑ribbon都是手工导出xml然后编辑的对于很多一开始接触CRM就用工具的人可能不是很熟悉.查了下这 ...
- scala学习笔记2(类,继承,抽象类)
class Person{ // _ 是占位符; var name : String = _ val age : Int = 27 // private[this] 定义的内容无法外部使用,起到保护作 ...
- Android:Field can be converted to a local varible.
背景 使用 Android Studio 开发 Android 有一段时间了,偶尔会碰到 AS 在一些私有变量上有黄色高亮提示Field can be converted to a local var ...