FSM:游戏开发中的有限状态机(理论篇)转
游戏系统的本质是输入加输出。我们把游戏系统划分为多个不同状态,不同的状态在不同输入下产出不同输出。按照这种思想,我们可以把游戏中复杂的子系统,比如战斗系统,划分成多个不同状态,然后我们要做的只是,对于不同的战斗操作输入,转换相应状态,执行相应状态下的动作输出。
那么什么是有限状态机? 我们要说的状态机输入和输出都是离散的、有限的;在这个基础上,我们所说的有限状态机就是描述这一类问题:
在有限的输入里,由于不同的输入时序产生的有限的输出组合的映射关系。要描述这种映射关系,有两种表达方式: 状态迁移表,和状态迁移图。
既然是一种映射关系,有没有可能实现一个种通用的有限状态机呢?
答案是可以的,这个意义上的通用有限状态机,就是来解析状态图并产生需要的输出的引擎。
要做到一个这样意义上的通用的状态机,要具备以下两个条件:
1、状态机的状态可配置
2、满足状态机的状态迁移的条件可配置
实际上就是状态迁移图可以配置
有限状态机分几类输出触发动作:
1、进入某一个状态的事件 简称进入动作(Entry action)
2、从某一个状态离开的事件 简称退出动作(leave action)
3、从某一个指定状态迁移到某一个指定状态的事件 简称转移动作(transfer action)
4、当系统处于某个状态并接收到某个特定的事件时,触发的事件 简称 输入动作(input action)
5、超时触发的动作 简称 超时动作(timeOut action)
以上的基本概念搞清楚了,就可以开始我们的fsm旅行了。
我们先以新手指引任务机器人来作为第一个fsm应用,而所有fsm应用都必须干第一件事,
1、画状态迁移图
这个状态迁移图描述的是一个作为客户端新手任务机器人的接收服务端输入事件与向服务端输出事件之间的映射关系。
也就是说要画好这个状态迁移图,首先要搞清楚客户端与服务端的交互模型,然后根据交互模型来划分状态, 需要先申明的是:状态图是可以嵌套的!
为什么要划分更细小的状态?
状态越细,那么意味着执行的action的粒度越细,那么状态机运转更流畅,不容易出现性能问题。
怎么划分状态呢?
首先状态是对外部环境而言,必须是可以观察到.也就是说必须是有输入和输出的,如果没有输入或输出,那么这个状态就是不可观察,也就是没有必要定义出来必要.
在这个基础上,我们描述一个区别于别的状态的依据就只能是有不同的输入和输出。如果有相同的输入和输出,那么我们就认为是同一个状态。也就是说真正的状态的划分,都从可观察的,输入输出,来判断一个状态的。
如何划分子fsm呢?
我们可以拿一个具体例子来举例: 新手任务的输入和输出流里,关于战斗的输入和输出流,可能在很多地方重复,比如接到战斗任务,以及在野外打怪的收集物品的任务的输入和输出流可能是一样的,那么就可以用一个子fsm来表示,那么就可以复用这一部分代码.
结论就是子fsm就是用来解决一个巨大状态机里输入和输出流重复的问题。
2、实现一个解析状态迁移图的fsm引擎
3、我们的fsm框架与传统的fsm编程的异同: fsm本质就是控制策略,传统的fsm编程,把控制策略和状态混合在一起了,我们的fsm框架,把控制策略和状态分离了。
以上是FSM理论知识,下篇《FSM:游戏开发中的有限状态机(实践篇)》将结合具体例子,讲解FSM在游戏中的实际运用。
http://blog.csdn.net/peter_teng/article/details/9151111
其他状态机相关的链接:
http://aigamedev.com/open/articles/fsm-implementation/