分层有限状态机的C++实现
为了方便我的游戏开发,写了这么一个通用的分层有限状态机。希望在其稳定以后,可以作为一个组件加入到我的游戏引擎当中。
目前使用了std::function来调用回调函数,在未来可能会用委托机制代替。
第一版仅仅是为了快速开发出来使用,在未来会对性能和易用性改进。
代码下载:http://download.csdn.net/detail/vvsxr/8060377
使用方法:
HFSM fsm;
fsm.addState(1);
fsm.addState(2);
fsm.addState(3);
fsm.addEvent(1, 1, 2);
fsm.addEvent(2, 2, 3, HFSM::PUSH);
fsm.addEvent(3, 3, 2, HFSM::POP);
fsm.setAfterEventCallBack(1, [](const HFSM::EventParameters ¶ms){printf("event %d happened\n", params.event); });
fsm.setAfterEventCallBack(2, [](const HFSM::EventParameters ¶ms){printf("event %d happened\n", params.event); });
fsm.setAfterEventCallBack(3, [](const HFSM::EventParameters ¶ms){printf("event %d happened\n", params.event); });
fsm.setEnterStateCallBack(1, [](const HFSM::EventParameters ¶ms){printf("enter state %d\n", params.to); });
fsm.setEnterStateCallBack(2, [](const HFSM::EventParameters ¶ms){printf("enter state %d\n", params.to); });
fsm.setEnterStateCallBack(3, [](const HFSM::EventParameters ¶ms){printf("enter state %d\n", params.to); });
fsm.setInit(1);
fsm.setFinish(2);
fsm.startup();
fsm.doEvent(1);
fsm.doEvent(2, HFSM::PUSH);
HFSM::EventParameters params;
fsm.doEvent(3, params, HFSM::SET);
流程就是1.创建状态机,2.加入状态,3.加入事件,4.加入回调函数,5.设置启动状态,6.启动状态机
注意:
1.不能加入状态STATE_NULL,是在hfsm.h里定义的,表示“无”状态。
2.不能加入事件EVENT_STARTUP,是在hfsm.h里定义的,表示状态机的“启动”事件。这两个常量被定义为不常用的数,你可以自己修改,现在它们的值为-9999999
3.addEvent有4个参数,分别为:事件ID,出发状态ID,到达状态ID,状态迁移类型。状态必须是已存在的状态,也就是说,最好先把所有状态都加入,再加入事件。状态迁移类型表示事件发生,新的状态是入栈还是直接代替原来的状态,有四个值:DEFAULT, SET, PUSH, POP,其中DEFAULT表示默认,在这里相当于SET。
4.set......CallBack 是设置事件发生前后,状态进出时调用的回调函数,第一个参数是ID,第二个参数是std:;function型的。这几个函数未来可能会改变,以支持委托机制。
5.setInit setFinish 是设置状态机的初始状态和最终状态
6.状态机必须调用startup() 函数才会启动,从“无”状态进入初始状态。
7.doEvent() 事件有三个参数,第一个是事件ID,第二个是事件参数,可以不写,如果需要给事件的发生附加参数,可以继承HFSM::EventParameters 类,然后再创建个实例作为参数。第三个参数表示状态迁移类型,解释见注意3,该参数如果不写,或设为DEFAULT,会使用定义这个事件时设置的迁移类型。
分层有限状态机的C++实现的更多相关文章
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...
- 人工智能AI------有限状态机、分层状态机、行为树
https://www.cnblogs.com/zhanlang96/p/4793511.html 人工智能遵循着:感知->思考->行动决策方法:有限状态机(Finite-State Ma ...
- 趣说游戏AI开发:对状态机的褒扬和批判
0x00 前言 因为临近年关工作繁忙,已经有一段时间没有更新博客了.到了元旦终于有时间来写点东西,既是积累也是分享.如题目所示,本文要来聊一聊在游戏开发中经常会涉及到的话题--游戏AI.设计游戏AI的 ...
- 使用行为树(Behavior Tree)实现游戏AI
——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...
- AI PRO I 第4章
Behavior Selection Algorithms An Overview Michael Dawe, Steve Gargolinski, Luke Dicken, Troy Humphre ...
- AI 行为树
by AKara 2010-12-09 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 谈到游戏AI,很 ...
- 【Unity】Domina-Game总结与反思
[Unity]Domina-Game总结与反思 2018/6/15 我总算是把物理课作业--Domina-Game给赶完了,这也算是我用Unity做的第一个游戏吧(不得不说我的脚本写的超烂的)...纪 ...
- (转)行为树(Behavior Tree)
转自:http://www.cnblogs.com/konlil/archive/2011/04/23/2025954.html 如果要让游戏里的角色或者NPC能执行预设的AI逻辑,最简单的用IF.. ...
- 了解游戏编程与 AI
噫语系列... 闲话 最近在重写我的一个 QQ 群机器人项目,并尝试将它改成更通用的结构,以方便在未来加入对 Wechat 和 Telegram 的支持. 在查资料的过程中,发现很多人认为一个群内多人 ...
随机推荐
- 善用GIMP(Linux下的Photoshop),图像处理轻松又自由
善用GIMP(Linux下的Photoshop),图像处理轻松又自由 作者: 善用佳软 日期: 2013-02-16 分类: 2 图像影音 标签: GIMP, image 1. GIMP是什么? GI ...
- Vue学习笔记-使用ElementUI
ElementUI官方地址:https://element.eleme.cn/2.11/#/zh-CN 1.初期准备 首先我们准备几个基本的样式文件:normalize.css 和 base.css ...
- 超简单!pytorch入门教程(三):构造一个小型CNN
torch.nn只接受mini-batch的输入,也就是说我们输入的时候是必须是好几张图片同时输入. 例如:nn. Conv2d 允许输入4维的Tensor:n个样本 x n个色彩频道 x 高度 x ...
- saltstack操作
使用分组 修改minon的ID,做一个标识 [root@node2 ~]# vim /etc/salt/minionmaster: 172.25.254.130 id: web1 #node2[roo ...
- 「UVA1185」Big Number 解题报告
UVA1185 Big Number In many applications very large integers numbers are required. Some of these appl ...
- win设置C、D、E等盘符图标为自定义的图片
1.选择一张jpg图片,在下面网站工具上,转为ico的图片(最好转64x64的清晰些). http://www.faviconico.org/favicon 2.在D盘下新建文本文件.txt,写入以下 ...
- Linux下Qt+CUDA调试并运行
Qt与CUDA相结合具体的操作主要修改qt项目中的配置文件pro.下面以测试的项目为例. 因为这是一个测试案例,代码很简单,下面将这几个文件的代码贴出来,方面后面对应pro文件和Makefile文件中 ...
- #ICCV2019论文阅读#Fully_convolutional_Features
一 知识背景 3D scan&cloud points(点云)patch-based features,fully convolutional network, deep metric lea ...
- 【转】[ppurl]从”皮皮书屋”下载电子书的姿势
转:http://blog.csdn.net/hcbbt/article/details/42072545 写在前面的扯皮 为什么标题的”皮皮书屋”加上了引号,因为皮皮书屋(http://www.pp ...
- PS/2的相关知识
PS/2接口 很多微机上采用PS/2口来连接鼠标和键盘.PS/2接口与传统的键盘接口除了在接口外型.引脚有不同外,在数据传送格式上是相同的.现在很多主板用PS/2接口插座连接键盘,传统接口的键盘可以通 ...