模糊状态机和状态机的区别就在于模糊状态机可以同时有好几个状态。这些状态有不同的重要度,然后根据重要度不同,状态的每帧逻辑更新函数的逻辑也有不同。
上一篇博客讲述了状态机了,这一篇就不讲相同的部分了。
比如我们设定一个由ai控制的坦克,这辆坦克可以不受发射炮弹的时间的限制,可以自由转动角度,可以以任意速度前进。(作弊!这简直是作弊!)
那么这个坦克拥有三个状态:
状态一:发射炮弹
状态二:转动角度
状态三:前进
那么状态机中就可以有一个成员函数:计算重要度();来计算这三个状态的重要度。
状态机::计算重要度()//你可以设计其他的计算重要度的逻辑
{
如果 敌军坦克不在射程
{
发射炮弹重要度=0;
}
否则
{
发射炮弹重要度 = 反比(敌军坦克离自己的距离);
}
如果 有敌军坦克且敌军坦克与自己有一个角度
{
转动角度重要度 = 反比(敌军坦克离自己的距离);
}
否则
{
转动角度重要度 = 0;
}
如果 敌军坦克离自己很远
{
前进重要度 = 正比(敌军坦克离自己的距离);
}
}
发射炮弹状态::每帧逻辑更新(每帧间隔)
{
static 记录持续时间 = 0;
记录持续时间 += 每帧间隔;
如果 记录持续时间 》 反比(发射炮弹重要度)
{
发射炮弹();
记录持续时间 = 0;
}
}
其他两个状态的逻辑更新同理。
状态机::每帧逻辑更新()
{
遍历 状态列表
每个状态-》每帧逻辑更新();
}
上一篇博客讲述了状态机了,这一篇就不讲相同的部分了。
比如我们设定一个由ai控制的坦克,这辆坦克可以不受发射炮弹的时间的限制,可以自由转动角度,可以以任意速度前进。(作弊!这简直是作弊!)
那么这个坦克拥有三个状态:
状态一:发射炮弹
状态二:转动角度
状态三:前进
那么状态机中就可以有一个成员函数:计算重要度();来计算这三个状态的重要度。
状态机::计算重要度()//你可以设计其他的计算重要度的逻辑
{
如果 敌军坦克不在射程
{
发射炮弹重要度=0;
}
否则
{
发射炮弹重要度 = 反比(敌军坦克离自己的距离);
}
如果 有敌军坦克且敌军坦克与自己有一个角度
{
转动角度重要度 = 反比(敌军坦克离自己的距离);
}
否则
{
转动角度重要度 = 0;
}
如果 敌军坦克离自己很远
{
前进重要度 = 正比(敌军坦克离自己的距离);
}
}
发射炮弹状态::每帧逻辑更新(每帧间隔)
{
static 记录持续时间 = 0;
记录持续时间 += 每帧间隔;
如果 记录持续时间 》 反比(发射炮弹重要度)
{
发射炮弹();
记录持续时间 = 0;
}
}
其他两个状态的逻辑更新同理。
状态机::每帧逻辑更新()
{
遍历 状态列表
每个状态-》每帧逻辑更新();
}