【问题标题】:What are the principles involved for an Hierarchical State Machine, and how to implement a basic model?分层状态机涉及哪些原则,以及如何实现基本模型?
【发布时间】:2018-10-15 09:54:24
【问题描述】:

所以我正在尝试使用 C++ 制作游戏,并且我已经阅读了大量关于 Finite State Machines (FSM)Hierarchical State Machines (HSM) 的文章。但是,我承认我读过的大部分内容都有些繁琐且难以理解,因此我希望有人可以为我简化它。 Is this answer an FSM or an HSM?

我想澄清一下:

  1. HSM 与普通 FSM 有何不同,为什么它更适合游戏?

  2. 关于 C++,如何实现遵循状态模式的基本 HSM? (我可能对此不正确/使用了错误的词语。)

  3. 您究竟是如何处理转换的?我经常听到的 on_exit 和 on_enter 方法是什么?

  4. 我的整个游戏都需要一个 HSM 吗? (例如,处理所有敌人、玩家动作、游戏菜单)还是我使用多个 HSM?

  5. 在实现玩家实体时,它们是否都是实体状态的子集?

  6. 最后,如果有人可以提供一些伪代码来帮助可视化这些问题,我将不胜感激。

【问题讨论】:

    标签: c++ implementation hierarchical fsm


    【解决方案1】:

    这只是关于嵌套。 HSM 基本上是一个 FSM,但每个状态又可以是一个单独的 FSM。

    以游戏中的示例为例,考虑一个 NPC。它有多种状态:

    1. 步行到A点
    2. 等一下
    3. 步行到B点
    4. 等一下
    5. 从 1 继续
    6. 与 PC 战斗

    这个 FSM 很简单,但是当 NPC 被 PC 攻击时,所有状态都需要转换到状态 6(与 PC 战斗)。这使得 FSM 有点难看。所以让这个更简单的FSM:

    1. 四处走动
    2. 与 PC 战斗

    这个FSM很简单,只有两个过渡,很容易理解。状态 1 的主要部分是次要 FSM:

    1. 步行到A点
    2. 等一下
    3. 步行到B点
    4. 等一下

    如果有一个事件与二级 FSM 转换不匹配,例如 PC 攻击,您可以上一级 FSM 以匹配该事件并找到合适的转换。

    您可以在某种程度上将其视为一个堆栈,较高级别的每个状态都可以推送一个新的较低级别 FSM。如果有一个与任何可能的转换都不匹配的偶数,则弹出堆栈并返回一个级别。继续,直到出现匹配的过渡。

    简而言之,这是一种简化 FSM 的方法。

    【讨论】:

    • 很好的解释。我以前从未听说过 HSM,我只是偶然发现了这个问题,但从现在开始可能会使用它们。
    • 很好的解释!如果你不介意我问,那么 HSM 就是一堆 FSM 放在一起。上一级究竟是如何工作的?我不太确定。
    • @Annabelle 最简单的方法可能是将其视为函数。每个 FSM 都是一个单独的功能。当你输入一个新的 FSM 时,你调用了一个函数。 “向上”只是从当前函数返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2014-06-25
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多