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种状态呢,很麻烦,看来还有更好更牛逼的方法,继续去学习了
- cocos2dx 3.0 了解有限状态机01
- cocos2dx 3.0 了解有限状态机02
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 有限状态机
- 内容观察者(针对contentprovider)
- 第六周项目4成员函数、友元函数和一般函数有区别
- 黑马程序员----objective-C 分类介绍
- 用css3拼凑出来的桃心
- Android创建桌面快捷方式
- cocos2dx 3.0 了解有限状态机01
- 第六章——访问权限控制
- crontab的日志分析
- 心路(一)
- 第6周-二试窗口-当年第几天
- Date Format Pattern
- C#第六周-WinForm可视化设计
- 大件安防联网报警警示牌 110警告小偷报警牌 店铺标示牌 门市警示
- 词根派生-E