游戏中状态机应用研究报告.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
显示全部