【游戏_忍者六道】状态机设计和实践之C++篇

原创 2016年08月28日 15:42:57

一 状态机原理

一般的状态机是如下图1所示
图 1  状态分布

                             图 1  状态分布

1.1. 当前,以简易储水发电机制作为例子说下,简单说下整个装置的分布:

            1. 蓄水池 是 存储 外部流入的水;
            2. 下拉开关 是 当 蓄水池 水 达到一定量时,开关控制 动滑轮 线上的 发电门阀下落,阻止水继续流出;
            3. 上拉开关 是 当 蓄水池 水 达到存储足够量时, 开关 控制 动滑轮 上线的 发电门阀 上拉 至 一定高度,让水流出蓄水池;
            4. 发电门阀 是 控制 蓄水池 水量的开关;
            5. 发电电扇 是 蓄水池 水流出,冲击 电扇进行发电,并存储电量;


    所谓状态机是拥有有限个状态,进行无限逻辑的,一旦触发相关事件,符合条件,状态切换到其他状态,执行其他状态的动作,状态分:起始状态,其他一系列状态,终态(结束状态)。起始状态一般是启动状态机进入的第一个状态, 蓄水池未满时,进行蓄水,外部水流入蓄水池,此刻发电门阀是关闭的;如果蓄水池水已满,则打开发电门阀,进行发电。然后,其他状态是  蓄水池 水流出到一定量之后,发电门阀下拉,阻止水流出。此刻,发电装置 没有终态,时刻处在事件触发进行 相应动作执行的逻辑。

图 2   蓄水池发电状态机

                  图 2   蓄水池发电状态机

二 游戏状态机应用

    在游戏开发中,各个状态都是由各种类逻辑实现的,定义一个Base基类,各个状态继承并实现它,基类中一般情况会包括两个虚函数:进入状态(EnterState)和离开状态(LeaveState)。
    // 枚举出所有状态
    enum  EMyState{
        ESTART = 1,
        EWAIT,
        EEND,
    }
     struct BaseState{
            // 进入状态
            virtual void EnterState(EMyState nState ) = 0;
            // 离开状态
            virtual void LeaveState() = 0;
    }
其中还需要一个状态管理器StateManager,实现管理状态接口,每个继承的子类都聚合在此实现状态迁移,耦合度低。
class CStateManager{

      public:
            void DoChangeState(EMyState nState)
            {
                    ...
                    // 离开 当前状态
                    pCurrentState->leaveState();
                    ...

                    switch(nState)
                    {
                            case xxx:
                                        pCurrentState = pxxx; // pxxx 是 BaseState 子类
                            ....
                     }
                    pCurrentState-> EnterState(nState ) ;
            }

    private:
           BaseState* pCurrentState;
}
    游戏开发中,ESTART开始状态是走的数据加载,整个功能的实现,首先需要数据的驱动支持,将数据加载至内存中之后,依赖外部事件触发,然后根据条件,触发相关的事件,切换状态,执行动作,跟状态的顺序无关,取决于各个事件触发的发生顺序,为一个事件而响应的行动不仅取决于事件本身,还取决于机器的内部状态。另外,采取 的行动还会决定并更新机器的状态。这样一来,任何逻辑都可建模成一系列事件/状态组合。
    终态一般是在游戏维护或者功能设计时设计好的,游戏维护是在动态修改内存数据,刷新修改脚本,维护包括修复bug,修改某些游戏玩法,某些数据等等。

图3  游戏应用一般状态机机制类图

                    图3  游戏应用一般状态机机制类图

    数据驱动类CDataDriver,为每个状态提供数据支持,该类数据接口,设计尽量要做到简便,不涉及强逻辑,数据操作不需要太过于复杂, 一般涉及到数据获取,设置,更新等,对数据库进行操作,游戏开发中一般使用MySql数据库,采用分布式服务器架构,数据库使用的同一个DataBase。   

 图 4  简单游戏分布式架构图

                    图 4  简单游戏分布式架构图

当各个客户端进行请求服务器操作,事件触发时,状态机切换,执行动作。

三 总结

    状态机在游戏中得到普遍应用,贯穿整个游戏过程,也是游戏开发者第一手知道掌握的设计模式。
版权声明:本文为博主原创文章,未经博主允许不得转载。

FSM:网络游戏开发中的有限状态机(实践篇)

上一篇文章《FSM:网络游戏开发中的有限状态机(理论篇)》中,讲解了FSM的基础知识。这里,我结合图形及具体例子,讲解下FSM在实际开发中的运用。 首先,图解下上篇文章中提到的各种action。 1....
  • peter_teng
  • peter_teng
  • 2013年06月22日 16:45
  • 6919

【游戏_忍者六道】状态机设计与应用之lua篇

一 前言上一篇图文描述了C++实现游戏中应用的状态机,C++中的三大特性:封装,继承,多态得以应用,封装数据引擎访问的增,删,查,改,状态机基类以及多种状态子类实现私有private或者公共publ...
  • feng1790291543
  • feng1790291543
  • 2016年09月04日 12:39
  • 975

游戏状态机的设计与实现

状态机的模型是非常简单,但并不是每个人都能设计好的状态机。因为好的状态机不仅需要对程序的把握要比较到位,同时需要对整个业务的理解比较到位。好的状态机使程序变的更加简洁,易扩展,容易查找bug,还非常稳...
  • hackmind
  • hackmind
  • 2014年10月22日 08:40
  • 7657

开发H5游戏的附加价值

H5游戏的发展确实是势不可挡的。2016年,H5游戏市场收入规模超过11亿元,产品超过6000款,用户规模突破2亿人,其市场快速增长仍旧是主旋律。随着游戏质量、货币化系统和分销渠道的进化,凭借H5跨平...
  • littlerascal112
  • littlerascal112
  • 2017年05月24日 10:01
  • 222

初读《演说之禅设计篇》有感

零零散散看了快半个月吧,还剩几十页,今天终于把那几十页看完了,直观感受就是,看起来说得挺不错的,但是如果换我自己去做,没有参考,能做出些许满意的PPT吗?尽管带着满满的不自信,但还是找出一份大一时候做...
  • u013816144
  • u013816144
  • 2016年06月21日 21:53
  • 415

H5游戏开发实战之 - 忍者跳跃

这是一款快节奏的攀爬游戏,游戏目标是不断的攀高,途中会遇到敌方忍者、生气的飞鸟、同时要避开屋角障碍,点屏幕时忍者会从墙的一头跳到另一头,进行躲避和击杀。先Show一下最终的成果 在线运行 在线编...
  • u013817584
  • u013817584
  • 2015年03月06日 18:23
  • 1288

游戏状态机介绍

游戏状态机实现介绍 任何一款游戏产品,都需要在几种界面之间进行转换:logo、trailer、main menu、in-game、settings menu等等,并且会在这些转换之间处理...
  • shiyongfu19890308
  • shiyongfu19890308
  • 2014年10月14日 18:49
  • 1971

H5游戏开发实战之 - 变身盒子

这是一个物理引擎游戏,有12关,游戏方式很简单:点击后方块变成圆球,过关条件:所有红球掉落。 原始版本js代码约1.5万行,这里只用200多行就实现了。 游戏界面: 在线运行 在线编辑下面我们...
  • u013817584
  • u013817584
  • 2015年03月02日 09:19
  • 804

版本管理之gitlab实践教程:基础篇(4)

gitlab中可以对用户/组/权限进行设定, 在这篇文章里面可以看到gitlab中可以添加哪些类型的用户,怎样管理group以及如何对权限进行设定....
  • liumiaocn
  • liumiaocn
  • 2017年07月05日 18:58
  • 669

版本管理之gitlab实践教程:基础篇(2)

这篇文章将会重点介绍一件事情: rebase。
  • liumiaocn
  • liumiaocn
  • 2017年07月04日 22:53
  • 796
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【游戏_忍者六道】状态机设计和实践之C++篇
举报原因:
原因补充:

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