cocos2dx 3.0 了解有限状态机01

来源:互联网 发布:多用户 分销 源码 编辑:程序博客网 时间:2024/06/06 09:51

“有限状态机”是由有限的状态组成的一个机制。一个“状态”就是一个状况。你考虑一下门;它的“状态”有“开”或“关”以及“锁”与“未锁”。

以我自身为列子,目前正在写博客,则状态为“写博客”,当给我输入一个“写代码”状态时,我就将跳转“写代码”状态。

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);    //gengxin    virtual 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 first    if ( !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种状态呢,很麻烦,看来还有更好更牛逼的方法,继续去学习了

0 0
原创粉丝点击