分层有限状态机的C++实现

5 篇文章 0 订阅
1 篇文章 0 订阅

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

目前使用了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,会使用定义这个事件时设置的迁移类型。

层次有限状态机(Hierarchical Finite State Machine)是一种状态机模型,用于描述系统的状态转移和行为。它是在传统的有限状态机基础上引入了分层的概念,使得状态机的模型更加清晰和灵活。 层次有限状态机由多个层级组成,每个层级包含一组状态和转移规则。每个层级内的状态和转移规则相对独立,但可以与其他层级中的状态和规则进行交互。通过这种分层的方式,可以将复杂的系统行为分解为多个简单的层级,从而提高代码的可读性和可维护性。 在层次有限状态机的模型中,状态可以分为两种类型:基本状态和层级状态。基本状态代表系统的最细粒度的状态,而层级状态由多个基本状态组成。层级状态可以包含子状态机,使得状态机的模型更加模块化和可扩展。 在状态转移方面,层次有限状态机采用了层级转移和局部转移两种方式。层级转移用于在层级状态之间进行状态切换,而局部转移用于在同一层级内的状态之间进行状态切换。通过这两种方式的组合使用,可以组织和管理复杂的系统行为。 总之,层次有限状态机是一种强大的模型,适用于描述和处理复杂的系统行为。它通过引入分层的概念,将系统的状态和行为组织成多个层级,提高了系统的可读性和可维护性。在实际应用中,层次有限状态机常用于游戏开发、机器人控制等领域,能够有效地管理系统的状态和行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值