有限状态机(finity state machine)

       有限状态机简称FSM,FSM就是描述一个过程由有限个独立状态组成,这些状态可以互相迁移,直到最终离开这个过程.游戏就是一个FSM,因为游戏总是由一些状态组成,每个场景就是一个状态,然后游戏的整个过程就是不断在这些场景中切换,来推动游戏的进行.可以说游戏框架不只是FSM,但是FSM绝对是游戏框架的核心.

        前一段时间通过移植一款韩国游戏,我从中抽出了一个FSM框架,是BREW平台上的.虽然现在这个FSM还不是很完善,可是足以拿来学习用了. 下面的类图描述了这个框架的静态结构.

       从上图可以看出,AbstractState类是所有状态类的接口,所有状态只是通过接口类AbstractState访问,AbstractState类隐藏了所有具体状态的细节,对外呈现一致的接口.状态管理类StateManager包含一个本程序中所有状态的数组,和一个当前激活状态的引用,因为在程序生命周期的任何时候都只有一个状态,而通过AEEApplet来的所有请求和事件,都转交给StateManager类,而StateManager类有通过
一致接口将其交给当前状态去处理.通过这样一个框架,有效的减少了具体状态和程序入口主体的耦合性,利于扩展.

        状态转移是怎么样实现的呢?首先有一点就是只有每个具体状态知道当前是否要改变状态,所以当知道要改变的时候,当前状态就将设置一个标志,设置下一个状态的ID,而StateManager类,当每一个刷屏时钟到的时候都要检测当前状态的改变状态标志,然后再改变状态.这样改变状态就是比较简单,但是有些耦合性,就是到处都有AbstractState::ChangeState()被调用.你也可以采取另一种方式来做这件事,就是在这个框架中加一个消息队列,然后每当要改变状态时就发消息,然后StateManager每一帧都在消息队列里抓消息,这样好像比较强大啊,但是你发消息不是还要在具体状态类中发吗,所以说具体类和状态改变之间的耦合在这种情况下是无法避免的.有一种情况是可以避免的,就是实现知道状态转化顺序的时候,这时可以建立一个静态转换表,然后要查表转化来转化状态.要不就是状态是线性的,状态管理类可以做成一个堆栈,进入下一个状态就是压栈,退出一个状态就是出栈,可是这样只适用于线性状态转化.在游戏中线性状态转化的情况很少.

谁要源码可以联系我zhaoxj01@hotmail.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值