FSM:网络游戏开发中的有限状态机(实践篇)

上一篇文章《FSM:网络游戏开发中的有限状态机(理论篇)》中,讲解了FSM的基础知识。这里,我结合图形及具体例子,讲解下FSM在实际开发中的运用。

首先,图解下上篇文章中提到的各种action。

1.InputAction:某状态下收到某事件,输出相应动作。这里不发生状态变更,只是对输入事件的一个响应。属于瞬时动作。



2.LeaveAction:离开某一状态时的相应动作。这个动作以后,到达下一状态。



3.TransferAction:某一状态到另一状态过程中的事件/动作。state1由于事件/动作action,转换为state2.它其实是EntryAction与LeaveAction的结合。



4.EntryAction:进入某一状态的动作/事件。



设计一个状态机,最重要的部分是设计一个良好的状态图,这个状态图能在代码中被严谨清晰的解析出来。所以其实我们关键要做两件事,一是设计合理的状态图,二是完成状态图的解析。下面结合游戏系统的一些代码进行这方面的讲解。

游戏中的装备系统,我们可以简单划分为上装状态(installState)与初始(下装)状态(standbyState)。状态划分代码如下:

[plain]  view plain  copy
  1. standbyState={  
  2.         event={[EquipEvents.CS_Install]="verifyInstall",  
  3.         },  
  4.         target={[EquipEvents.CS_Install]="installState",  
  5.         },  
  6.         action={  
  7.             entryAction={},  
  8.             leaveAction={},     
  9.             transferAction={},  
  10.             inputAction={[EquipEvents.S_Fix]="fix",[EquipEvents.S_SpecialFix]="specialFix"},  
  11.             timeOut={},  
  12.         },  
  13.     }  

[plain]  view plain  copy
  1. installState={  
  2.         event={[EquipEvents.CS_Uninstall]="verifyUninstall",  
  3.               },  
  4.         target={[EquipEvents.CS_Uninstall]="standbyState",  
  5.                },  
  6.         action={  
  7.             entryAction={"install",},  
  8.             leaveAction={"uninstall"},  
  9.             transferAction={},  
  10.             inputAction={[EquipEvents.S_Fix]="fix",[EquipEvents.S_SpecialFix]="specialFix"},  
  11.             timeOut={},  
  12.                },  
  13.     }  

刚开始装备处于standbyState,收到上装事件EquipEvents.CS_Install后,变为installState。状态图的解析按以下流程进行:

1.判断是否存在下一状态,如果不存在,即做inputAction。因为收到的事件在这里面无映射,并且存在下一状态installState,所以这个action不做事。

2.存在下一状态。做leaveAction。无映射,不做事。

3.做transferAction。无映射,不做事。

4.以上都做完后,状态变为下一状态,即installState。开始做entryAction。这里因为我们已经到达installState,所以entryAction要去installState中找。发现存在一个动作install,于是开始做上装这个动作。

至此,完成上装过程。另外,在installState中,我们去修理装备(fix),状态机的解析只做inputAction后,就结束,只做fix这个动作,并不改变状态,属于瞬时过程。

猜你喜欢

转载自blog.csdn.net/larry_zeng1/article/details/80346653