- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
游戏中的状态机研究报告
游戏中的状态机研究报告
姚慧敏
什么是状态机
关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。
状态机的分类和扩展
有限状态机
(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
您可能关注的文档
- 浙江省金华市第十八中学八年级数学下册第三章频数及其分布单元测试浙教版.doc
- 浙江试卷(笔试A3)2011面向中高级职称评审(试卷).doc
- 浙江高三英语每日完型阅读改错快速练习.doc
- 浙江高一化学大班7.doc
- 浦东新区2010届高三上学期期末质量检测语文试卷(附答案).doc
- 浦东实验学校2015.3.16地理抽测试卷.doc
- 浦东新王牌春季周末高二有机物选择题.doc
- 浪漫主义与德意志民族主义探讨.doc
- 浙浙江省宁波市2011届高三高考模拟试题英语.doc
- 浦东金桥秋季补习班地理讲义地球运动专题1.doc
- 游戏王星尘加速器攻略.doc
- 湖北利川历史2014初中毕业学业考试试卷.doc
- 湖北十堰数学2014初中毕业学业考试试卷.doc
- 湖北大学2004至2005学年度西方伦理学课程试卷B.doc
- 湖北天门语文--2015年初中毕业生毕业考试.doc
- 湖北武汉物理2015初中毕业学业考试试卷.doc
- 湖北省八市2013届高三3月联考历史试题Word版含答案.doc
- 湖北省2013届高三5月高考模拟及答题适应性考试理综试题A卷Word版含答案.doc
- 湖北省四校(襄州一中枣阳一中宜城一中曾都一中)20142015学年高一上期中联考语文试题word版含答案.doc
- 湖北沙市中学2010届高三5月月考文综地理部分.doc
文档评论(0)