上一篇文章《FSM:网络游戏开发中的有限状态机(理论篇)》中,讲解了FSM的基础知识。这里,我结合图形及具体例子,讲解下FSM在实际开发中的运用。
首先,图解下上篇文章中提到的各种action。
1.InputAction:某状态下收到某事件,输出相应动作。这里不发生状态变更,只是对输入事件的一个响应。属于瞬时动作。
2.LeaveAction:离开某一状态时的相应动作。这个动作以后,到达下一状态。
3.TransferAction:某一状态到另一状态过程中的事件/动作。state1由于事件/动作action,转换为state2.它其实是EntryAction与LeaveAction的结合。
4.EntryAction:进入某一状态的动作/事件。
设计一个状态机,最重要的部分是设计一个良好的状态图,这个状态图能在代码中被严谨清晰的解析出来。所以其实我们关键要做两件事,一是设计合理的状态图,二是完成状态图的解析。下面结合游戏系统的一些代码进行这方面的讲解。
游戏中的装备系统,我们可以简单划分为上装状态(installState)与初始(下装)状态(standbyState)。状态划分代码如下:
standbyState={
event={[EquipEvents.CS_Install]="verifyInstall",
},
target={[EquipEvents.CS_Install]="installState",
},
action={
entryAction={},
leaveAction={},
transferAction={},
inputAction={[EquipEvents.S_Fix]="fix",[EquipEvents.S_SpecialFix]="specialFix"},
timeOut={},
},
}
installState={
event={[EquipEvents.CS_Uninstall]="verifyUninstall",
},
target={[EquipEvents.CS_Uninstall]="standbyState",
},
action={
entryAction={"install",},
leaveAction={"uninstall"},
transferAction={},
inputAction={[EquipEvents.S_Fix]="fix",[EquipEvents.S_SpecialFix]="specialFix"},
timeOut={},
},
}
刚开始装备处于standbyState,收到上装事件EquipEvents.CS_Install后,变为installState。状态图的解析按以下流程进行:
1.判断是否存在下一状态,如果不存在,即做inputAction。因为收到的事件在这里面无映射,并且存在下一状态installState,所以这个action不做事。
2.存在下一状态。做leaveAction。无映射,不做事。
3.做transferAction。无映射,不做事。
4.以上都做完后,状态变为下一状态,即installState。开始做entryAction。这里因为我们已经到达installState,所以entryAction要去installState中找。发现存在一个动作install,于是开始做上装这个动作。
至此,完成上装过程。另外,在installState中,我们去修理装备(fix),状态机的解析只做inputAction后,就结束,只做fix这个动作,并不改变状态,属于瞬时过程。