网站大量收购独家精品文档,联系QQ:2885784924

游戏中状态机应用研究报告.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
--(完美WORD文档DOC格式,可在线免费浏览全文和下载)值得下载!

游戏中的状态机研究报告 姚慧敏 什么是状态机 关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。 状态机的分类和扩展 有限状态机 (1)有限状态机的定义和特征:有限状态机,它包含了有限个“状态”和状态之间的“转移”,彼此连成一个有向图。它主要用于整个游戏场景的管理或操作单个的游戏对象和人物。有限状态机也是一种有向图的数据结构,由三部分组成: ◎内在的所有条件; ◎输入条件; ◎状态之间起到连接作用的转换函数。 一个有限状态机是一个设备,或是一个模型,具有有限数量的状态。它可以在任何给定时间根据输入进行操作,使得系统从一个状态转换到另一个状态,或者是使一个输出或者一种行为的发生,一个有限状态机在任何瞬间只能处于一种状态。 (2)完成一个有限状态机 先记下AI要进行的基本行为,然后用图形表示,再变成实际的代码。下面以一个带有武器的士兵AI来举例说明怎样设计一个有限状态机。 AI规则: 敌人在户外区,没有障碍物 他有预定停留点,循环巡逻 当你进入敌人的视线锥面时,敌人激活 敌人看到你就追 他带有剑 如果离你很近,他就会停下来,用剑刺你 图形布局: 在编码之前,一定要用简单的框图得到所有状态和变换的全貌。状态用一个圆表示,而箭头则表示状态转换正在发生,标记好每一个状态和状态转换之间的条件,在接下来的编码中将会表现的更加清晰。 如下图所示,士兵有四种状态,到达停留点(Realign Waypoint)、寻找停留点(Seek Waypoint)、追逐玩家(Chase player)和攻击玩家(Fight player)。转换的条件有: 转弯(Aligned)、找到巡逻点(Waypoint Reached)、看见玩家(See player)、距离限制(Distance)、玩家死亡或离开视线(Player dead or lost sight)。 编写代码: 完成规则和图之后,编写有限状态机就是一件很简单的事情了。对于状态机中所有的状态,我们要先枚举出来,最好用0来代表初始的状态,用整数表示其他的状态。因此,如果有限状态机欧N个状态的话,则最后一个状态的枚举值应为N-1。我们学习了C++语言,因此用C++中的#define语句生产状态名。 有限状态机的程序框架如下所示: #define SEEK_WAYPOINT 0 #define ROTATE_WAYPOINT 1 (…) 用一个整形变量表述AI所处的状态,从而驱动一个switch结构: int state switch(state) { case 0: { //这个状态的特定代码 break; } (…) case N-1: { //这个状态的代码 break; } default: { break; } } 上面是一个有限状态机的代码框架,下面我们来完成我们的士兵状态机。 #define SEEK_WAYPOINT 0 #define ROTATE_WAYPOINT 1 #define CHASE_PLAYER 2 #define FIGHT_PLAYER 3 bool aligned; bool reachwaypoint; bool seeplayer; bool playerlost; bool distancelimited; int state; while(1){ switch(state) { case 0: { animation1(); if(reachwaypoint) { state=1; } else if(seeplayer) { state=2; } break; } case 1: { animation2(); if(aligned) { state=0; } break; } case 2: { if(playerlost) { state=0; } else if(!distancelimited) { state=3; } break; } case 3: { if(distancelimited) { sta

文档评论(0)

wdhtm341 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档