为了方便我的游戏开发,写了这么一个通用的分层有限状态机。希望在其稳定以后,可以作为一个组件加入到我的游戏引擎当中。

目前使用了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 &params){printf("event %d happened\n", params.event); });
fsm.setAfterEventCallBack(2, [](const HFSM::EventParameters &params){printf("event %d happened\n", params.event); });
fsm.setAfterEventCallBack(3, [](const HFSM::EventParameters &params){printf("event %d happened\n", params.event); });
fsm.setEnterStateCallBack(1, [](const HFSM::EventParameters &params){printf("enter state %d\n", params.to); });
fsm.setEnterStateCallBack(2, [](const HFSM::EventParameters &params){printf("enter state %d\n", params.to); });
fsm.setEnterStateCallBack(3, [](const HFSM::EventParameters &params){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++实现的更多相关文章

  1. 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)

    命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...

  2. 人工智能AI------有限状态机、分层状态机、行为树

    https://www.cnblogs.com/zhanlang96/p/4793511.html 人工智能遵循着:感知->思考->行动决策方法:有限状态机(Finite-State Ma ...

  3. 趣说游戏AI开发:对状态机的褒扬和批判

    0x00 前言 因为临近年关工作繁忙,已经有一段时间没有更新博客了.到了元旦终于有时间来写点东西,既是积累也是分享.如题目所示,本文要来聊一聊在游戏开发中经常会涉及到的话题--游戏AI.设计游戏AI的 ...

  4. 使用行为树(Behavior Tree)实现游戏AI

    ——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...

  5. AI PRO I 第4章

    Behavior Selection Algorithms An Overview Michael Dawe, Steve Gargolinski, Luke Dicken, Troy Humphre ...

  6. AI 行为树

    by AKara 2010-12-09 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 谈到游戏AI,很 ...

  7. 【Unity】Domina-Game总结与反思

    [Unity]Domina-Game总结与反思 2018/6/15 我总算是把物理课作业--Domina-Game给赶完了,这也算是我用Unity做的第一个游戏吧(不得不说我的脚本写的超烂的)...纪 ...

  8. (转)行为树(Behavior Tree)

    转自:http://www.cnblogs.com/konlil/archive/2011/04/23/2025954.html 如果要让游戏里的角色或者NPC能执行预设的AI逻辑,最简单的用IF.. ...

  9. 了解游戏编程与 AI

    噫语系列... 闲话 最近在重写我的一个 QQ 群机器人项目,并尝试将它改成更通用的结构,以方便在未来加入对 Wechat 和 Telegram 的支持. 在查资料的过程中,发现很多人认为一个群内多人 ...

随机推荐

  1. vue-learning:11 -js-nextTick()

    nextTick() 在jQuery中,如果我们要生成一个ul-li的列表元素,我们也不会在循环体中每生成一个li就将它插入到ul中,而是在循环体内拼接每个li,待循环体结束后,再一并添加到ul元素上 ...

  2. UVA - 10480 Sabotage (Dinic)

    The regime of a small but wealthy dictatorship has been abruptly overthrown by an unexpected rebel-l ...

  3. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  4. 牛客多校第三场 F Planting Trees

    牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...

  5. 使用condition 实现线程顺序执行

    书上给的例子都是ABCABC这种,比较简单,复杂点的如A0B0C0, A0A1A2没有,手动实现下,做个记录 1. A0 A1 A2 A3 public class Demo0 { private s ...

  6. HDU1556 Color the ball & 牛客 contest 135-I 区间 [差分标记]

    一.差分标记介绍 差分标记用来解决针对区间(修改-查询)的问题,复杂度比线段树要更低.推荐这个博客. 例如,给数组中处于某个区间的数进行加减操作,然后查询某个位置上数的变化值. 二.HDU1556 C ...

  7. c++ CArray函数

    CArray属于MFC,是一个数组模板类.MFC的数组类支持的数组类似于常规数组,可以存放任何数据类型.常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,即先确定大小,而MFC数组类创建的对象 ...

  8. EasyUI清空combotree下拉框图标

    代码: //清空combotree下拉框图标 $(".tree-icon,.tree-file").removeClass("tree-icon tree-file&qu ...

  9. js/jq判断鼠标滚轮方向

    js判断鼠标滚轮方向: var scrollFunc = function (e) { e = e || window.event; if (e.wheelDelta) { //判断浏览器IE,谷歌滑 ...

  10. 最详细的自定义Spring Boot Starter开发教程

    1. 前言 随着Spring的日渐臃肿,为了简化配置.开箱即用.快速集成,Spring Boot 横空出世. 目前已经成为 Java 目前最火热的框架了.平常我们用Spring Boot开发web应用 ...