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

AI 状态机的更多相关文章

  1. AI逻辑实现-取舍行为树还是状态机

    AI逻辑实现-选择行为树还是状态机? 关注AI的朋友可能会看过赖勇浩翻译的<有限状态机时代终结的10大理由> ,里面谈到了状态机的诸多弊端.同时在ppt(附上下载地址)中述说了行为树的诸多 ...

  2. 6_State 游戏开发中使用状态机

    ### State 不好的代码 ``` //处理玩家输入的代码 void Heroine::handleInput(Input input) { if (input == PRESS_B) { if ...

  3. “分而治之”,一种AI和动画系统的架构

    译者注:随着国内游戏研发水平的不断提高,对画面品质的不断提升,同时大量手游使用Unity和Unreal 4等成熟的工具开发,动作状态机已经不是什么陌生的概念了.我们在项目开发时也大量使用了动作状态机. ...

  4. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  5. 趣说游戏AI开发:对状态机的褒扬和批判

    0x00 前言 因为临近年关工作繁忙,已经有一段时间没有更新博客了.到了元旦终于有时间来写点东西,既是积累也是分享.如题目所示,本文要来聊一聊在游戏开发中经常会涉及到的话题--游戏AI.设计游戏AI的 ...

  6. 做游戏长知识------基于行为树与状态机的游戏AI(一)

    孙广东 2014.6.30 AI. 我们的第一印象可能是机器人,如今主要说在游戏中的应用. 现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完毕的.比方在RPG游戏中 ...

  7. Unity教程之-基于行为树与状态机的游戏AI

    AI.我们的第一印象可能是机器人,现在主要说在游戏中的应用.关于AI的相关文章我们在前面也提到过,详细请戳这现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完成的.比 ...

  8. FSM(状态机)、HFSM(分层状态机)、BT(行为树)的区别

    游戏人工智能AI中最常听见的就是这三个词拉: FSM 这个不用说拉,百度一大堆解释, 简单将就是将游戏AI行为分为一个一个的状态,状态与状态之间的过渡通过事件的触发来形成. 比如士兵的行为有“巡逻”, ...

  9. MMORPG大型游戏设计与开发(服务器 AI 概述)

    游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...

随机推荐

  1. Linq常用

    1.左关联查询var lst = from m in db.信息          join d in db.明细信息          on m.单号 equals d.单号 into mi     ...

  2. 【BZOJ】【2157】旅游

    LCT 直到动手写拆边为点的时候才发现根本不会写……去orz了一下Hzwer(话说这题应该也用不着LCT吧……下次再换种姿势写一遍好了) /****************************** ...

  3. [vijos 1770]大内密探

    描述 在古老的皇宫中,有N个房间以及N-1条双向通道,每条通道连接着两个不同的房间,所有的房间都能互相到达.皇宫中有许多的宝物,所以需要若干个大内密探来守护.一个房间被守护当切仅当该房间内有一名大内密 ...

  4. c++ 虚继承

    虚继承(个人感觉用到的地方不多,项目中没有用到这个的) 最典型的例子就是iostream的继承方式 class istream : virtual public ios{...};//此处就是虚继承, ...

  5. Sqrt函数高效实现

    转自一个Sqrt函数引发的血案 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来 ...

  6. 【设计模式六大原则2】里氏替换原则(Liskov Substitution Principle)

      肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的. 定义1:如果对 ...

  7. java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍

       线程的概述:         线程是程序的多个执行路径,执行调度的单位,依托于进程存在.线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系 ...

  8. HTML5 文件API(二)

    1.FileSystem概述及浏览器检 2.申请磁盘配额 3.创建文件

  9. Mac + IDEA + JRebel破解方法.

    [重要提示]---最佳人生 一.只推荐当计算机无法访问互联网时使用本破解文件. 二.如果可以访问互联网,建议直接到JRebel官网注册JRebel会员获取[正版永久免费]使用的授权码.JRebel会员 ...

  10. i386 和amd64 的意思

    首先可以简化一个概念,i386=Intel 80386.其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称. Windows NT类系统的安装盘上,通常i386是其根上的一个文件夹, ...