by AKara 2010-11-11 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras

一个简单横版游戏demo的角色动作状态,可用状态机来处理状态间跳转和行为逻辑。

使用 有限状态机(FSM) 可将状态的特性处理局部化,并提供单一可控的转化渠道在
多状态间切换,还为状态/事件的追踪/回溯/录制提供便利,甚至状态对象可以
全局共享单件。可使角色动作,怪物AI(HFSM)等方面制作简化/可维护。网上好文很多。

更直观的作用是去除大片壮观的if缩进。

---------------------------------------------------------------------

首先需要规划出状态集和事件集。
  以角色在横版场景中的基本移动需求为例,大致状态可分:
  > 空闲(idle)
  > 跑动(moving)
  > 跳(jumping)
  > 二段跳(jumping2)
  > 冲刺(dashing)
  > 踩空掉落(falling)
  > 受伤倒地(hurting)
  > 重生(reborn)
 
  而事件输入则为(事件来源可能是键盘,网络,状态内迭代...):
  > 按键停止(ev_idle)
  > 跑动(ev_move)
  > 跳(ev_jump)
  > 冲刺(ev_dash)
  > 掉落(ev_fall)
  > 受伤(ev_hurt)
  > 重生(ev_reborn)
  > 恢复空闲(ev_restore_idle)
  > 恢复跑动(ev_restore_moving)

贴一下状态和事件的跳转图(点击小图可看大图):
 
 
  乍看像个完全图的复杂度,但是使用状态机来编码实现起来却非常清晰。

---------------------------------------------------------------------

编码时,事件可以是一个复杂对象而不单单是事件码,以适应某些场合下
携带参数的需求,也方便在网络上一体化发送。

如果状态越来越多,可以考虑将状态分层,比如移动层,战斗层:即所谓的
并行状态机,在一定程度上避免了大量的状态同层交叠。

---------------------------------------------------------------------

某些时候,可以将状态机的思想简化利用。
  比如网游中会有很多这样的限制:
  当角色在战斗态时,不允许发起摆摊操作;
  当角色在交易态时,不允许发起战斗操作;
  当角色在监狱态时,不允许发起道具传送门使用操作;
  ......

其实只需定制一个全局事件限制表:规划好状态位和事件,然后定制一张表:
 
  事件1 : 禁止该事件的状态集合
  事件2 : 禁止该事件的状态集合
  事件3 : 禁止该事件的状态集合
  .....

然后每个玩家对象只需一个N bit字段提供状态位on/off描述,当事件发生时
检测对应的禁止状态集合的各个bit是否任意一bit为on即可判断是否禁止。

---------------------------------------------------------------------

而当状态/事件非常少时,可能直接编码比引入状态机编码更方便。

---------------------------------------------------------------------

相关文章:
  <<M.U.G.E.N格斗游戏引擎简介(1)>> by AKara
  http://blog.csdn.net/akara/article/details/6898157

<<使用行为树(Behavior Tree)实现游戏AI>> by AKara
  http://blog.csdn.net/akara/archive/2010/12/19/6084786.aspx

<<使用行为树(Behavior Tree)实现网游奖励掉落系统 >> by AKara
  http://blog.csdn.net/akara/archive/2011/01/26/6165421.aspx

最新文章

  1. 关于Android避免按钮重复点击事件
  2. Lr IP欺骗设置
  3. JVM调优总结 -Xms -Xmx -Xmn -Xss
  4. Linux环境下实现哲学家就餐问题
  5. Java——异常
  6. Python - python不是内部或外部命令
  7. android 自定义控件,自定义属性设置
  8. resolve &quot;Undefined attribute name&quot; warning for Angular &quot;ng-&quot; attributes in HTML files
  9. virtualBox,webstorm,开虚拟机传代码
  10. ubuntu-17.10 安装 FANN
  11. Custom Grid Columns - FireMonkey Guide
  12. 【iOS】Objective-C 字符串操作
  13. 字典Key值为变量
  14. iOS调用第三方导航和线路规划
  15. c#的as,is 运算符
  16. tomcat中的日志开关文件(logging.properties)介绍
  17. 迷你MVVM框架 avalonjs 学习教程16、过滤器
  18. 团队项目(第四周冲刺之二)—GG队
  19. (转)Pig 重写加载函数和存储函数UDF
  20. FOJ 1402(dp推规律)

热门文章

  1. XCode签名证书死活不能选
  2. Java---算法---插入排序
  3. GetSurfaceLevel
  4. MethodInvoker 委托
  5. PHP 开发中的外围资源性能分析(一)
  6. UVA 11174 Stand in a Line (组合+除法的求模)
  7. hdu 4447 Yuanfang, What Do You Think?
  8. cojs 自己出的题目 解题报告
  9. js错误:对象不支持此属性或方法
  10. iOS 越狱机免证书调试