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 游戏开发与实战第三章内容
		变换 学习目标 理解如何使用矩阵表示线性变换和仿射变换 学习对几何体进行缩放.旋转和平移的坐标变换 根据矩阵之间的乘法运算性质,将多个变换矩阵合并为一个单独的净变换矩阵 找寻不同坐标系之间的坐标转换方 ... 
随机推荐
- clang-format中文出错
			clang-format中文出错(金庆的专栏)VS2015 Community + clang-format(Visual Studio plugin installer, based on SVN ... 
- MySQL执行插入操作时报错1366 - Incorrect string value
			今天在测试mysql时,发现插入数据的问题,下面和大家分享下解决方法: 首先看问题原因: [Err] 1366 - Incorrect string value: '\xCF\xD6' for col ... 
- PHP学习(1)——我为什么要学PHP
			PHP简介 PHP是一种服务器端的脚本语言,特别适合做web开发.高效.灵活.实用是PHP的特点.PHP最开始是Personal Home Page的缩写,后来正式更名为了"PHP:Hype ... 
- FFmpeg在Linux下安装编译过程
			转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下 ... 
- 求链表倒数第n个元素
			提示:设置一前一后两个指针,一个指针步长为1,另一个指针步长为n,当一个指针走到链表尾端时, 另一指针指向的元素即为链表倒数第n个元素. #include <stdio.h> #inclu ... 
- 分布式缓存GemFire架构介绍
			1什么是GemFire GemFire是一个位于应用集群和后端数据源之间的高性能.分布式的操作数据(operational data)管理基础架构.它提供了低延迟.高吞吐量的数据共享和事件分发.Gem ... 
- Spark技术内幕: Shuffle详解(一)
			通过上面一系列文章,我们知道在集群启动时,在Standalone模式下,Worker会向Master注册,使得Master可以感知进而管理整个集群:Master通过借助ZK,可以简单的实现HA:而应用 ... 
- EBS HRMS数据表
			4.1. 人员基本息 表 (PER_ALL_PEOPLE_F) ... 
- Ubuntu15.10 安装OpenCV3.1
			wget https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/3.1.0/opencv-3.1.0.zip/downloa ... 
- 05 Activity生命周期
			生命周期:一个Activity从创建到销毁经过的全部方法 1.onCreate() 创建一个Activity的时候执行的方法 2.onStart()Activity可以被看见到时候无法交互(没有焦点) ... 
