cocos2d-x 游戏开发之有限状态机(FSM) (三)
来源:互联网 发布:js中获取json对象的值 编辑:程序博客网 时间:2024/05/22 13:01
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(); }}
0 0
- cocos2d-x 游戏开发之有限状态机(FSM) (三)
- cocos2d-x 游戏开发之有限状态机(FSM) (二)
- cocos2d-x 游戏开发之有限状态机(FSM) (一)
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
- unity游戏开发中的有限状态机FSM经验
- cocos2d-x游戏开发之三
- Cocos2d-X游戏开发(三)
- [ IOS-Cocos2d-x 游戏开发] - cocosBuilder 开发之三
- FSM:游戏开发中的有限状态机(理论篇)
- 游戏开发教程cocos2d-x移植之三(上)
- Cocos2d-x游戏开发之三 NODE_FUNC和CREATE_FUNC说明
- Cocos2D-x游戏开发之三:音乐播放
- 【cocos2d-x游戏开发】 从零单排之(三)
- Unity3D架构系列之- FSM有限状态机设计(三)
- Unity3D架构系列之- FSM有限状态机设计三
- U3D架构系列之- FSM有限状态机设计三
- [ IOS-Cocos2d-x (Box2d)游戏开发之三] -Cocos2d-x 结合Box2D开发Android游戏配置方法
- 【iOS-cocos2d-X 游戏开发之三】游戏存储之Cocos2dX自带CCUserDefault类详解
- [leetcode] 学习记录——Factorial Trailing Zeroes
- 比较简单的导出EXCEL
- 黑马程序员—04OC核心语法_01
- Android Context 上下文 你必须知道的一切
- simple add
- cocos2d-x 游戏开发之有限状态机(FSM) (三)
- Struts2 XML配置详解
- LISTVIEW
- JDK各个版本的新特性jdk1.5-jdk8
- codeforces #286
- Unity3d shader之卡通着色Toon Shading
- free命令详解
- 使用笔记本建立免费无线热点 Create Free Ad-Hoc NetWork
- 关于Web Worker的一些心得