人物有限状态机
之前看这个状态机没看懂,今天又翻出来,看的略懂
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. RocketMQ的异步调用

    这个异步调用方法中传入一个final 回调对象. public void invokeAsyncImpl(final Channel channel, final RemotingCommand re ...

  2. oc自定义不定参数函数

    -(void)getValueFormConfig:(NSString *)key,... or -(void)getValueFormConfig:(NSString *)key,...NS_REQ ...

  3. JS的同步加载、异步加载

    在使用js展开式菜单时,发现只有加载完页面包含的js文件时,展开菜单才能折叠起来. 查找了一下原因:是因为js页面加载使用的是同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前 ...

  4. Jquery的promise对象

    一直用jquery,ajax一直是这么写: $.ajax({ url: 'abc.com/index', type: 'post', data: { abc:1 }, success: functio ...

  5. iOS定位服务CoreLocation

    欢迎訪问我的新博客: 开发人员说 基于LBS的应用开发是当今移动开发中的一大热门, 当中主要涉及到地图和定位两个方面. iOS开发中, 定位服务依赖于CoreLocation框架, CLLocatio ...

  6. C/C++中,空数组、空类、类中空数组的解析及其作用

    转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多 ...

  7. TensorFlow学习笔记 速记2 报错:failed call to cuDevicePrimaryCtxRetain: CUDA_ERROR_INVALID_DEVICE

    版本: tensorflow-gpu 原因: 在创建session时没有使用我想让它用的gpu 解决方案: 1. 在python程序中: import os os.environ["CUDA ...

  8. 206. Reverse Linked List【easy】

    206. Reverse Linked List[easy] Reverse a singly linked list. Hint: A linked list can be reversed eit ...

  9. [c#.Net]DevExpress使用记录

    Devexpress知识点 Grid controlDataSource使用BindingList<>,动态绑定数据源 Grid viewOptionBehaviour.Editable可 ...

  10. is char signed or unsigned?

    工作这么多年,一直认为char是有符号的,而事实上gcc和vs默认也是有符号,但是c规范里实际并没有指明char是有符号还是无符号,所以char比较特殊, char signed char unsig ...