cocos2d-x 游戏开发之有限状态机(FSM) (三)

cocos2d-x 游戏开发之有限状态机(FSM) (三),第1张

概述cocos2d-x 游戏开发有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态。然后Monkey类就实现了行为与状态分离。Monkey类只负责自己的行为,MonkeyFSM作为Monkey的成员,负责状态调度。MonkeyFSM调用状态模式类的方法,状态模式类调用真实对象Monkey的方法。注意本文例子代码只是为了说明问题,并不 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  100class 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) (三)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1034859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存