cocos2d-x 游戏开发之有限状态机(FSM) (一)
cocos2d-x 游戏开发之有限状态机(FSM) (一)
参考: 1 最简单的状态机
#ifndef MONKEY_H_ #define MONKEY_H_ #include <time.h> #include "cocos2d.h" USING_NS_CC; #define MAX_STOP_TIME 10 #define MAX_WALK_TIME 20 #define MAX_WALK_DIST 100 enum MonkeyState { stSTOP,stWALK,stTURN }; class Monkey : public Node { public: Monkey() { log("Monkey()"); } CREATE_FUNC(Monkey); virtual bool init() { _curPos = 0; _step = 1; changeState(stSTOP); this->scheduleUpdate(); return true; } void changeState(MonkeyState newState) { _curState = newState; _curTime = time(0); } 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); } void update(float dt) { switch (_curState) { case stSTOP: if (isStopTimeout()) { changeState(stWALK); walk(); } break; case stWALK: walk(); if (isWalkOutBorder()) { changeState(stTURN); turn(); } else if (isWalkTimeout()) { changeState(stSTOP); stop(); } break; case stTURN: changeState(stWALK); walk(); break; } } private: MonkeyState _curState; 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_ 2 坏代码的味道显然,如果继续将上面的代码写完整的话,它一定能很好的工作。但我似乎已经闻到了传说中“坏代码”的味道,上面长长的条件判断语句,会随着状态的增多变得更长。每增加一个状态,就需要在长长的条件判断语句中小心查找和修改。当这样的条件语句增长到需要多个人合作完成时,那当导致严重的维护与调试方面的问题。另外,对于编译型语言而言,一个具有N个状态的FSM要查找一个正确的状态,平均需要进行N/2次的判断。在上面的状态机中,其实是让这个对象在不同的状态中表现出了不同的行为特征,那不同的行为特征之间除了有类似的形式化的接口之外,基本上没有任何的联系。那我们很自然地想到状态模式,利用状态模式维护状态,实现对象与维护状态的分离。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 用 TClientDataSet 创建 XML 文件的过程 - 回复"丁永其
- Binary XML file line #3: <item> tag requires a
- TQ2440裸机实验(复制nand flash 前4K到SDRAM)
- c – 当std :: for_each()返回时为什么要调用转换运算符?
- LeetCode 21. 合并两个有序链表 Merge Two Sorted Lists(C
- 记事本删除所有文本除了匹配正则表达式
- c# – IList的默认getter
- Cocos2dx 3.0 过渡篇(十七) std::bind与CC_CALLBACK不得不
- 基于React,Redux以及wilddog的聊天室简单实现
- 当我清理Xcode DerivedData时,我无法在iOS模拟器中运行我的