有限状态机简称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) (三)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)