【步兵 经验篇】状态机(续)

原创 2016年06月02日 00:22:30

【步兵 经验篇】状态机(续) by EOS.

前面也提到过状态机,是根据人物的动作状态划分的,通过运用状态机可以降低耦合性。
今天来介绍一下 按功能来划分的状态机,目的还是一样的,仍然是为了低耦合。


定义

#pragma once

//先定义一个基类
class BaseState
{
public:
    virtual void onEnter() = 0;//进入
    virtual bool onLoop() = 0;//自循环
    virtual void onExit() = 0;//退出

    bool isRunning;
};

//拾取状态
class PickUpState : public BaseState
{
    //...
};

//战斗状态
class BattleState : public BaseState
{
    //...
};

//采集状态
class CollectState : public BaseState
{
    //...
};

//护送状态
class EscortState : public BaseState
{
    //...
};

完成了这些,就可以把人物驱动起来了,当然前提是人物的基本功能已经实现。
而且这套状态机,并不属于人物自身,应该是并行的。
比如用一个FSMExecutor来管理,而且每种state只需要初始化一次。


讲解

我就拿 拾取和战斗 来局里说明吧

//FSMExecutor可以存储runState和一个changeState,并在update中进行处理,
//changeState的时候,调用onEnter,并赋值给runState
//然后在update中当是isRunning为true时候调用onLoop
//if(!onLoop()) onExit();
//这只是一种形式,也可以纯回调,省去update开销。
//(但是我更倾向与前者,更加直观,可读性更强,更有大师的味道=。=)

//拾取状态 -- 物品掉落到地上然后去捡起来
class PickUpState : public BaseState
{
    void onEnter(){};//比如强行中断一些状态,直接去捡东西
    bool onLoop() {//自循环
        //这个就比较有讲究了=。=
        //这里的onLoop不应该是帧回调,而是触发式回调
        //比如 我拾取状态 干的事情就是要拾取,并且只负责拾取,这样来达到低耦合
        //所以 onLoop 要干的事情就是,获取我可以拾取物品的队列,物品可以按距离排下序
        //然后 一个onLoop只负责捡去一个,当拾取完的时候回调自己,这个可以用msg来驱动改变run的状态
        //判断下PickUpState 状态,当寻路设置时候设置为false,拾取完设置为true
        //直到当列表为空时,返回false,来触发onExit。
        //纯回调:就是拾取结束 回调onLoop,在onLoop中判断无可拾取,自行调用onExit
    };
    void onExit() = 0;//比如判断 是自动战斗状态,我就直接切入到战斗状态
};

//战斗状态
class BattleState : public BaseState
{
    bool onLoop() {//直接进入重点了
        //有了前面的铺垫这个应该就会好理解多了。
        //战斗 负责的就是打怪,一只一只的打(当然也可以是多个多个的)。
        //获取怪物列表,寻路过去,开干。
        //寻路和战斗的时候isRunning = false,攻击目标消失了就isRunning = true
        //这个就不能列表为空来中断了,一般是无限刷的=。=
        //所以中断条件 比如掉落物品、切换回拾取,捡完再切战斗,这样一个简单的挂机效果就出来了。
        //再或者 要打N个怪这种任务,然后任务完成了,中断,直接去找NPC 之类的
    };
};

从上面可以看出,在onLoop也就是主要逻辑来处理的时候,基本上是和其他状态没有关系的。
(ps:onLoop用文字说明起来,可能觉得代码量很少,但实际代码可能会很多)
这也就降低耦合,也就是相互之间的关联性,我写拾取的时候可以完全不考虑战斗。

就这些 = 3=

See Again~
之前
真爱无价,欢迎打赏~
赞赏码

版权声明:本文为博主原创文章,未经博主允许不得转载。

【步兵 c++】实例讲解 状态机

【步兵 c++】结合实例讲解状态机 by EOS. 一次面试中,问到状态机,感觉自己答的不够好,回来总结了一下。 用脚本搬砖时间太长了,感觉c++好多东西都忘了。 写东西用到c++也是,功能写好了...

【Cocos2d-x 状态机篇】第03章源码

  • 2012年12月21日 08:10
  • 994KB
  • 下载

【Cocos2d-x 状态机篇】第04章源码

  • 2012年12月21日 08:15
  • 1003KB
  • 下载

【步兵 经验篇】组件模式的特点

【步兵 经验篇】组件模式的特点 by EOS.组件模式对u3d的开发者可能并不陌生,因为其框架设计大量的使用了这种模式, 但是cocos却没有使用,不过后来出的js也开始套用这种模式,他能被效仿,...

【步兵 经验篇】图片加密之我见

【步兵 经验篇】图片加密之我见 by EOS.现在apk满大街飞,直接下载一个apk改后缀名为rar,就可以看到里面的东西,我相信大家都知道, 也就是说,如果资源不加密的话,游戏的美术资源就成了别人...

【步兵 经验篇】代码中的文件夹

【步兵 经验篇】代码中的文件夹 by EOS.【新建文件夹】是使用电脑是最常见的操作,可以让我们的方便管理自己的数据、文档或者电影相片。 当我查找的时候就会分层次的进行筛选,在众多的数据文件中,一层...

【步兵 经验篇】工厂模式 in Game

【步兵 经验篇】工厂模式 in Game by EOS.最近在看《Effective Java中文版 第2版》,密码 968n,虽然是java的, 但是讲的很有深度,是不错的一本书,而且语言直接是都...

【步兵 经验篇】 快速开发之我来带你飞

【步兵 经验篇】 快速开发 By EOS.我这个人从来不水的,一般都是会直接进入正题,看过前面博客的都知道, 但是我这里还是介绍一下标题,什么叫快速开发?所谓的快速开发就是还真不太好说,总之就是速...

【步兵 经验篇】新手引导

【步兵 经验篇】新手引导 By EOS.今天有人问我怎么让策划配表能实现新手引导啊, 改来改去快改死了。可能好多人都会遇到这样的问题,所以写一篇文章给大家提供下思路。正题首先 想配表实现引导不难,前...

【步兵 经验篇】 链式编程

【步兵 经验篇】 链式编码 by EOS.什么是链式编程链式编程就是以函数返回this的方式把多个语句串联起来。 上面也提到了一点,那就是更贴近人的思维逻辑,思维连贯、语意集中。 这样思路就会变的清...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【步兵 经验篇】状态机(续)
举报原因:
原因补充:

(最多只允许输入30个字)