有限状态机(Finite State Machine)在游戏中的应用和实现

版权声明:转载时请务必保留以下作者信息和链接
作者:陈维([email protected]

有限状态机(Finite State Machine)是软件领域里的一个很重要的工具,很多东西的模型其实就是有限状态机。

有限状态机的确切描述它是一个有向图形,由一组节点和一组相应的转移函数组成。我们在游戏里看到精灵在场景中休息、奔跑、攻击等连续的动作,都可以理解成精灵处于不同的状态下的表现。这些行为是由有限的状态组成的一个机制,每一次行为的变化都是由当前“行为”接收一个“输入”,“输入”的结果导致行为产生变化开始下一种行为。就是说状态遇到状态转换事件发生导致状态发生改变。关于有限状态机理论知识的介绍不是我写这篇文章的目的,大家可以通过Baidu或者Google去了解这方面基础知识,这里主要是通过一个实例来介绍有限状态机在游戏里的应用,下面的类图是我通过有限状态机对于游戏中精灵状态变换的实现。



State是表示状态的接口,它的各种实现类是状态的基本单位,好像表示待机的IdlyState和表示移动的MovementState。通常某一种具体状态下,会有着很多连续的表现让精灵显得更生动(例如,休息状态下会时不时的眨一下眼睛,奔跑状态下会有连续的挥臂及迈腿动作等),所以在State对象里还维护了一个状态序列帧(StateFrame)的列表。

StateFrame也是一个接口,它子类是该状态下某一具体帧的表现,它内部维护了表示当前状态下的后一帧(StateFrame),这样的设计使得在同一状态下的不同帧可以顺序平滑的过渡。

一个状态管理器(StateManager)维护当前的精灵状态和一个精灵状态转换对象(StateTransformer)的列表,列表中每个StateTransformer对象均表示一个状态迁移的过程,这个过程由2个不同的状态(State)和一个状态变化事件(SpriteEvent)组成。

SpriteEvent定义了精灵不同的状态事件(休息、移动、攻击...)。

精灵状态转换对象(StateTransformer)的列表相当于一个二维数组,第一维表示状态转换对象的集合,第二维元素则是具体状态变化的过程。当状态变化事件发生,需要给精灵的赋予一个新的行为时,只需要将新的状态变化事件设置到状态管理器,状态管理器根据当前状态和状态变化事件从第一个维度中找到状态转换对象,然后再从状态转换对象中取得下一个应该执行的状态,进一步其锁定设置成当前状态。

至此,就完成了一次状态变化事件发生后由状态A到状态B的转换过程。具体到游戏表现就是英雄在跑动(状态A)中发现了一个怪物,鼠标点击这个怪物发起了一次攻击命令(事件),英雄则由跑动行为转换为攻击(状态B)行为。

你可能感兴趣的:(游戏,Google,领域模型)