cocos2dx 3.0 了解有限状态机02

2024-05-28 16:18

本文主要是介绍cocos2dx 3.0 了解有限状态机02,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇胡乱的介绍了一下状态机,这就是面向过程的,哪里是出OO的,想cocos2dx 这样面向对象的引擎,还是找一种设计模式比较好,考虑到状态模式适用于这样的场景:

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

果断采用状态模式来试一下,据说有限状态机是依据这种模式来实现的,这里就先用状态模式来实现一下吧。
点此了解状态模式

1.我们要设计一个BaseState类,由该类抽象出writeCodeState,GoSleepState, GoToClassState 类。
2.然后修改AS类(在上篇有源码),将AS中的枚举去掉,谁让我们已经写了各种状态类了呢,就不要枚举了。将curState成员变量类型改为BaseState,多态就是这么屌。

现在是不是感觉有点像策略模式,其实还是比较好区别的,
点此了解一下区别

说这么多,还是来点实例靠谱,上代码

头文件
#ifndef __STATE__H__
#define __STATE__H__
#include "AS.h"
class AS;class BaseState {
public:virtual void excute(AS* as) = 0;
};class WirteCodeState : public BaseState {void excute(AS* as);
};class GoToClassState : public BaseState {void excute(AS* as);
};class GoSleepState : public BaseState {void excute(AS* as);
};#endif
源文件
#include "State.h"
#include "cocos2d.h"void WirteCodeState::excute(AS* as) {if (as->isTired()) {  as->GoSleep();      //睡觉去as->changeState(new GoSleepState());}
}void GoToClassState::excute(AS* as) {if (as->isTired()) {as->GoSleep();as->changeState(new GoSleepState());}
}void GoSleepState :: excute(AS* as) {if (as->isWantToWriteCode()) {as->WriteCode();as->changeState(new WirteCodeState());}else {as->GoToClass();  //上课as->changeState(new GoToClassState());}
}

再来改变一下AS类

#ifndef __AS__H__
#define __AS__H__
#include "cocos2d.h"
#include "State.h"
USING_NS_CC;class BaseState;
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(BaseState* endState);//gengxinvirtual void update(float dt);public:BaseState* 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(BaseState* endstate) {this->curState = endstate;
}/*更新每帧
*/
void AS::update(float dt) {curState->excute(this);
}

置于执行类,几乎没有什么变化,chageState参数变了而已。

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(new GoSleepState());return true;
}

运行结果
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 write code!
AS will sleep!
AS will write code!

和之前最大的区别就是update了,是不是相对简单了,这样再添加写博客状态时候,就不用在改变AS了,直接再写一个子类就好了,这才是面向对象的效果嘛。
缺点也很明显,状态太多,需要创建太多的类。
看来还有更好的状态机,继续去学习

这篇关于cocos2dx 3.0 了解有限状态机02的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011062

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java了解相对较多!

我是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。   委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。   下

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那