2012-12-1(状态机补)

之前写的没有保存,思路也不是很清晰。今天补更。

写下自己理解的FSM。

固定数量的状态    状态跳转        输入影响条件     本身的状态 

首先他状态的个数是有限的,状态机控制几个状态之间的转换。

控制条件是当前状态和输入的影响条件()来共同决定。

将每个状态单独提取出来变成一个类。类内包含状态的属性和状态的更新函数。

创建一个状态机管理类,用来管理状态。

管理类应该可以返回当前状态 设置当前状态 状态跳转函数

最主要在状态跳转函数里面 通过传入的参数判断是不是需要 进行状态转换,当前状态改变,走新状态的beginState()

--------------------------------------------------------

层次状态机

网上关于层次状态机的介绍很多都是概念。没涉及到具体的函数,可能因为应用场景不尽相同吧。

在github上传了我的层次状态机情景。感觉很多地方处理的不好。

大致思路是 有状态机管理类,他管理的是具体状态上面的根状态,就是第一层次。然后第一层次里面的状态跳转函数来判断是否要跳转到里面的小状态里面。

---------------------------------------------------------

 StateManage={CurrentState,PreState}         --有当前状态 前一个状态
FightStateRoot={RootStateName,state}             --根状态 
NoFightStateRoot={RootStateName,state}          --根状态
NoActionState={StateName}                   --静止挂机状态
NormalAttackNoActionState={StateName}       --普通攻击状态

 --执行函数
function stateManage.Excute(self,Value)
   --根据 传入的 变量和 当前的状态 执行对应函数
   
   if self.CurrentState.RootStateName == "非战斗状态" and Value.name == "敌人攻击" then 
   --关闭非战斗状态 EndRootState
   self.CurrentState:EndRootState()
   self.CurrentState=Fight                   --进入 到战斗状态 
   --   到战斗状态 的 BeginRootState 
   self.CurrentState:BeginRootState()
   else if self.CurrentState.RootStateName == "战斗状态" and Value.name == "环境安全" then 
   --关闭战斗状态 EndRootState
   self.CurrentState.EndRootState()
   self.CurrentState=NoFight                   --进入 到非战斗状态 
   --   到战斗状态 的 BeginRootState 
   self.CurrentState:BeginRootState()
   
    --不用大状态 切换  执行Excute
   self.CurrentState:RootExcute(Value)                    -- 执行 对应状态的 Excute函数 
end

-------------------------------------------------------------------

执行函数的代码  思路是在管理机类里面的excute 判断是否应该进行大状态转换。再在大状态的excute判断是否进行具体的消状态转换。

转换的时候先走 前一个状态的endState再走新状态的 beginState().

 

posted @ 2016-12-14 10:37  梁志铭  阅读(181)  评论(1)    收藏  举报