游戏流程系统 – GameFlowSystem

  • A+
所属分类:系统文档

# 一、简介

  • 游戏有很多不同的流程状态(比如:Login、Mainmenu、Loading、StartBattle、Battling、EndBattle、Dialog(NPC 对话)、....)。
    以前的我可能最喜欢用枚举来列举这些状态,用 if else/switch 来判断状态,处理对应的游戏逻辑,但这太 low 了。
    再加上游戏大大小小的状态数不胜数,不同游戏有不同的状态,需求变幻莫测!
    这种设计就像用木棍搭建起的一栋摇摇欲坠的危楼,只要有一点风吹草动,大概率就是重做!

  • 状态模式很适合这种场景,它的设计就像一个插线板(状态管理类)和插头(状态),
    只要分别抽象并实现(插线板和插头),无论是小到音箱、个人电脑和显示器,大到巨型计算机、城市供电等,都能即插即用。

# 二、状态模式

  • 状态模式
  • 在状态模式中,类的行为是基于它的状态改变的。 这种类型的设计模式属于行为型模式。
  • 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
  • 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。
  • 因此
    • 只要实现状态接口,可以为该类设计无数个状态。
    • 改变类的状态就可以改变类的行为,说明行为定义在状态中,用统一的状态接口去执行这个行为。

# 三、UML 类图

# 1、IXXGameFlowStateManagerInterface - 插线板接口

  • UXXGameFlowStateManager 实现了该接口,用它管理和切换游戏的主要状态,即游戏流程状态。

# 2. UXXGameFlowState - 插头

  • 继承 UXXGameFlowState 就能得到一个全新的状态。
  • 为什么这里不在抽象一层接口?
    • 因为 UXXGameFlowStateManager 需要使用 UObject 的功能(如:IsA),不然每次还需要 Cast 转换。
  • UXXGameFlowState 在拥有子状态?
    • UXXGameFlowState 只需要继承 IXXGameFlowStateManagerInterface 并实现就可以继续嵌套状态。

# 四、抽象状态机

# 1. 上面的状态模式不足之处

  • 其他地方需要状态模式怎么办?
    • 最直接的肯定是继承然后实现!
    • 缺点:1. GameFlowStateManager 是为游戏流程管理定制的,继承会导致大部分代码修改和重载! 2. 可能导致功能和命名不匹配

# 2. 更进一步的状态模式

  • 将状态模式中的状态机抽象出来!并且使用模板类实现,可以在编译阶段优化虚函数的调用
  • UML 类图
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin