本文主要是介绍cocos2dx 3.0 了解有限状态机01,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
“有限状态机”是由有限的状态组成的一个机制。一个“状态”就是一个状况。你考虑一下门;它的“状态”有“开”或“关”以及“锁”与“未锁”。
以我自身为列子,目前正在写博客,则状态为“写博客”,当给我输入一个“写代码”状态时,我就将跳转“写代码”状态。
AS现在有三种事情要去做,上课、睡觉、写代码(三种状态);累了就要睡觉,醒了之后不是写代码就是去上课,但是最近失眠太严重,课程也太多,上课是必须去的,写代码就写不下去了,写代码的概率也就是10%;
下面介绍一下不能称之为状态机的状态机。其实也就是if-elseif -elseif ,或者说是switch/case的使用,对于小一点的游戏,感觉还可以使用,直接上代码。
#ifndef __AS__H__
#define __AS__H__
#include "cocos2d.h"
USING_NS_CC;enum State {Enum_GoClassState,Enum_WirteCodeState,Enum_GoSleepState
};class AS :public Node {
public:virtual bool init(); //覆写CREATE_FUNC(AS); //构造函数//判断是否累了bool isTired() { return true; };//判断是否想写代码bool isWantToWriteCode();//休息睡觉void GoSleep();//写代码void WriteCode();//上课void GoToClass();//切换状态void changeState(State endState);//gengxinvirtual void update(float dt);private:State curState; //当前的状态};#endif
下面实现这些
#include "AS.h"
USING_NS_CC;bool AS::init() {if (!Node::init()) {return false;}this->scheduleUpdate();return true;
}bool AS::isWantToWriteCode() {float tmp = CCRANDOM_0_1(); //睡不着的情况下就是不想写啊if (tmp < 0.1f) {return true;}return false;
}void AS::GoSleep() {CCLOG("AS will sleep!");
}void AS::GoToClass() {CCLOG("AS will go to class!");
}void AS::WriteCode() {CCLOG("AS will write code!");
}/*切换状态
*/
void AS::changeState(State endstate) {this->curState = endstate;
}/*更新每帧
*/
void AS::update(float dt) {switch (curState){case Enum_GoClassState: //当AS在上课时if (isTired()) {GoSleep();//睡觉去changeState(Enum_GoSleepState); //将当前状态改为睡觉状态}break;case Enum_WirteCodeState: //写代码状态时if (isTired()) {GoSleep();//累了就睡去changeState(Enum_GoSleepState);}break;case Enum_GoSleepState: //睡醒了该干什么呢if (isWantToWriteCode()) { //如果想写代码//那就写呗WriteCode();changeState(Enum_WirteCodeState);}else { //还是上课去吧GoToClass();changeState(Enum_GoClassState);}break;default:break;}
}
以上便是AS类,包含一些执行方法(在这里写成输出字符串)。
下面来使用一下As类,让AS执行一些方法。
bool HelloWorld::init()
{//////////////////////////////// 1. super init firstif ( !Layer::init() ){return false;}Size visibleSize = Director::getInstance()->getVisibleSize();Vec2 origin = Director::getInstance()->getVisibleOrigin();auto as = AS::create();this->addChild(as);//初始化为睡觉状态as->changeState(Enum_GoSleepState);return true;
}
运行结果如下
AS will write code!
AS will sleep!
AS will go to class!
AS will sleep!
AS will go to class!
AS will sleep!
AS will go to class!
AS will sleep!
AS will go to class!
AS will sleep!
AS will go to class!
AS will sleep!
AS will go to class!
AS will sleep!
AS will go to class!
我去,看来AS最近失眠严重,不是睡觉就是上课,几乎没怎么写代码。
开始说过,写博客也是一种状态,给AS添加写博客的状态时,需要改动枚举类型、switch部分,但是如果是10种状态呢,很麻烦,看来还有更好更牛逼的方法,继续去学习了
这篇关于cocos2dx 3.0 了解有限状态机01的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!