状态机也叫有限状态机是一种模型,可以模拟生活游戏中的大部分事物,如红绿灯、汽车的行驶状态、游戏角色的状态等
比如生活中的红绿灯,把红绿灯看成状态机的话,那它有三种状态,绿、黄、红
通常情况下绿灯只能转变成黄灯、黄灯只能变成红灯、而红灯只能变成绿灯
可用下面的结构表示:
{name = "green", turn = "yellow"}
{name = "yellow", turn = "red"}
{name = "red" , turn = "green"}
对于游戏中的角色来说,它会有跑(走、飞)run、待机idle、战斗battle、死亡die、复活birth等状态
当角色处于出生的的状态时,可以转换为待机状态,也可以转换为死亡状态(刚出生就被打死)、也可以转换为跑动状态
当角色处于跑动状态时,他可以转换为待机状态,死亡状态,这里要注意不能变为出生状态,因为玩家本来就没死
......
玩家的状态虽然很多,但是终归是有限的,状态间虽然可以转换,但也是有转换类别的限制
正在上传…重新上传取消
可用下面的结构表示:
{name = "birth", turn = {"idle", "die", "run"},
{name = "run", turn = {"idle","die"},
{name = "idle", turn = {"run","die"},
{name = "die", turn = {"birth"},
状态机特征
1、状态(state)总数有限
2、任一时刻只会处在一种状态
3、在某种条件下状态会从某种状态变换成另外一种状态
在ECS架构下的设计
StateBase 类, 为state的基类,设置一些id、owner、dict(状态转换的关系)
StateXXX state类,继承自StateBase实现各个状态下要做的事情
StateMachine 对state对象管理的类、对state的增删改查、state状态转换的管理(退出当前state进入下一个state)
FsmComponent 附在实体(player、monster、NPC等)上的组件
用于创建StateMachine对象,并对StateMachine对象添加state的对象,设置currState, 并且对当前的state执行enter操作,以及获取currState等操作
FSMHelper state类的管理器 dofile 所有的State类 并把其存储起来 这这里面可以创建StateMachine 和state 给那些没法加载FsmComponent的情形用