人物有限状态机
之前看这个状态机没看懂,今天又翻出来,看的略懂
FSM在游戏中应用的地方还是挺多的 怪物AI,玩家行为管理
条件(包含若干事件) 条件(包含若干事件)
状态1<-------------------->状态2<------------------->状态3
状态之间跃迁通过条件,条件包含若干事件
.初始化条件
// 从读表器中查找编号为i的记录
const PlayerFSMConditionInfo* pInfo = (const PlayerFSMConditionInfo*)kConditionLoader.Find(i);
if (pInfo)
{
// 新建条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
// 为条件添加事件
for (int j = ; j < eFsmEvent_Amount; j++)
{
// 因为0也代表了一个事件,所以,这里用-1来判定对应字段是否有有效数据
if (pInfo->nEvtArray[j] != -)
{
// 加入该事件包含的条件
pCondition->AttachEvent(pInfo->nEvtArray[j]);
}
}
// 将条件存入条件集合中
m_vecConditions[i] = pCondition;
}
else
{
m_vecConditions[i] = NULL;
} // 不同于条件的加载过程,这里需要首先将所有状态构造出来
// 以备稍后对所有状态进行跃迁条件的设置
for (int i = ; i < eFsmState_Amount; i++)
{
//创建所有的状态
m_vecStates[i] = new FSMState(i);
} .注册每个状态的目标状态和相应的条件
// 表格中的记录总数由读表器给出
nCount = kStateLoader.GetRecordCount();
for (unsigned int i = ; i < nCount; i++)
{
// 取得第i条记录
const PlayerFSMStateInfo* pInfo = (const PlayerFSMStateInfo*)kStateLoader.Find(i);
// 使用表格数据,注册状态跃迁信息
// 即:nSrcStateID状态通过条件nConditionID,可跃迁至nDstStateID
RegistTransition(pInfo->nSrcStateID, pInfo->nDstStateID, pInfo->nConditionID);
} .发送事件,跃迁动作
FSMCondition kCondition(eFsmEvent_Amount);
{
OutputLog(">>>>>>>> 用户按下鼠标\n");
kCondition.Reset();
kCondition.AttachEvent(eFsmEvent_Click);
m_kFSM.Transition(&kCondition);
ShowFSMState();
} void FSM::Transition(FSMCondition* pCondition)
{
//根据条件将当前状态尝试进行状态跃迁
FSMState* pState = m_pCurrentState->Transition(pCondition);
if (pState != m_pCurrentState)
{
// 保存之前的状态
m_pLastState = m_pCurrentState; // 设置当前状态为新的状态
m_pCurrentState = pState; // 通知观察者
Notify();
}
} FSMState* FSMState::Transition(FSMCondition* pCondition)
{
for (unsigned int i = ; i < m_vecTargetCondition.size(); i++)
{
//查找是否是目标条件的子集
if (m_vecTargetCondition[i]->IsSubSetOfCondition(pCondition))
{
//返回对应的目标状态
return m_vecTargetState[i];
}
}
return this;
} 基本过程这样的
通过配置将条件及其所包含的事件,状态跃迁的条件配置好,程序加载读取配置文件
当动作(事件)发生时,通过该事件构造一个条件,将这个条件和当前状态的目标条件进行匹配,如果匹配上了,就返回对应的目标状态,如果发现状态不同就通知观察者就相应变化,在根据状态决定其行为

人物FSM的更多相关文章

  1. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

  2. 计算机人物系列-Mauchly,Eckert,Goldstine

    关键词:莫尔学院(Moore School),阿伯丁试验场(Aberdeen Proving Ground), 雷明顿兰德公司(Remington Rand Corporation), IBM院士(I ...

  3. Python学习笔记(2) Python提取《釜山行》人物关系

    参考:http://www.jianshu.com/p/3bd06f8816d7 项目原理:   实验基于简单共现关系,编写 Python 代码从纯文本中提取出人物关系网络,并用Gephi 将生成的网 ...

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

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

  5. 有限状态机(FSM)

    在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑 那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑, 如果用有限状态机,维护起来会非常麻烦, ...

  6. unity3d 第三人称视角的人物移动以及相机控制

    何谓第三人称?就像这样: 用wasd控制人物移动,同时保持在相机的中心.用鼠标右键与滚轮控制相机的角度和距离. 先说一下人物的移动: 首先给作为主角的单位加上 Charactor Controller ...

  7. Android 游戏教程让人物动起来

    在这里给大家分享Android游戏教程怎样让人物动起来,话不多说了,直接进入正题. 一. 准备工作     首先要准备好要使用的人物动作图和地形图.把它分割成16个不同的动作,循环播放同一行的4个不同 ...

  8. FSM 浅谈

    之前写过一篇关于状态机的,上一篇讲过的我也就不再罗嗦了,不知道欢迎去查看我的上一篇随笔,主要是感觉上次自己封装的还是不行,所以又进行修改了一番! 我本人是个菜鸟,最开始接触状态机的时候,状态机一个可厉 ...

  9. 浅谈敏捷组织中PMO的人物

    所谓的"敏捷组织"其实并没有标准的形式,而且PMO(项目办理单位)并没有一个标准的人物界说.有一个十分遍及的误解,公司在挑选"灵敏"或许"瀑布&quo ...

随机推荐

  1. replace的用法

    http://blog.sina.com.cn/s/blog_9ed9ac7d0101ec1f.html replace 语句 如果存在,更新,否则,插入在使用REPLACE时,表中必须有唯一索引,而 ...

  2. Android EditText输入字数限制总结(包含中文输入内存溢出的解决方法)

    转载请注明,大飞:http://blog.csdn.net/rflyee/article/details/38856539 限定EditText输入个数的解决方式非常多,可是一般主要考虑两点.也就是处 ...

  3. 关于public、private、protected、internal

    1.private修饰符 private修饰符用于设置类或类成员的訪问权限仅为所属类的内部, private也被称为私有修饰符.某些时候须要訪问私有类成员时,可通过get和set訪问器读取或改动. 2 ...

  4. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面如何自动运行,不让用户干涉,设置起始界面

    右击视图管理器,添加一个TargetVisualization   在起始视图中点击右边的按钮,然后选择一个HMI作为起始HMI     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: h ...

  5. 小伙子又乱码了吧-Java字符编码原理总结

    前提 配合前面阅读的I/O和NIO的资料,现在总结一下关于字符集和乱码问题的原理和解决方案.参考资料: 码表ASCII Unicode GBK UTF-8 字符编码笔记ASCII,Unicode和UT ...

  6. POJ 2392 Space Elevator(贪心+多重背包)

    POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木.每种积木都有一个高度h[i],一个数量num ...

  7. 设计模式:工厂方法模式(Python)

    来自:http://blog.csdn.net/ericzhong83/article/details/7604728 工厂方法模式(Factory Method Pattern): 定义了一个创建对 ...

  8. Bootstrap-初步学习

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="utf-8&quo ...

  9. 把sqlserver查询结果复制到Excel出现数据记录遗漏

    问题:今天在sqlserver查询,总共有10000记录,把结果复制到Excel,发现少掉352条,用导出csv也是如此. 原因:经排查发现缺少的记录是因为商品名称字段包含英文双引号". 解 ...

  10. 561. Array Partition I【easy】

    561. Array Partition I[easy] Given an array of 2n integers, your task is to group these integers int ...