[状态机变种]有关状态栈的一些记录

注意
本文最后更新于 2023-07-30,文中内容可能已过时。

写这篇文章的时候,笔者还是一个很菜的菜鸟, 本文可能有误。

我在弄我们公司的项目的时候。 地图 上面的每一个实体,我是当作一个单位来看的。每隔若干毫秒对地图所有的实体进行一个update ,更新他们的状态。

在更新他们的状态的时候,往往需要根据他们的当前状态来决定怎么更新他们。这可以用状态机来实现。 也可以考虑用行为树来实现。但是我不会。。 所以我采用了一种简单版本的状态机来做。

所有的状态如下列表

  1. 等待
  2. 眩晕
  3. 移动
  4. 站立
  5. 追击
  6. 使用技能
  7. 被嘲讽

我本来是记录一个实体就一个状态。根据不同的状态做事情。但是有个问题是,如果这个实体进行等待中了, 在他等待结束的时候就需要调整他的状态。 我本来是根据一些别的参数(当前是否有移动路径,当前是否有追击对象) 来做调整的。 但是这样做容易出bug.. 而且很不好。

所以我做了一些调整。 我现在让每个单位身上不是具有一个状态。而是具有一个状态栈。 这样就能比较良好的处理各个状态之间的转换。尤其是处理等待,眩晕的时候。

默认的栈顶是一个 站立 状态。 当有新的状态进来的时候 直接入栈。 当该状态结束的时候 则把该状态出栈。

比如 站立的时候 因为某种需求变成移动状态了。 然后就一直移动,直到 到达目的地。然后 退回成站立状态。 比如在移动追击某个敌人的时候 转换成了施放技能的状态。 等技能释放 结束之后 还是在 追击状态。

个人觉得,这种情况实现起来比行为树简单一些。 然后出问题的情况比 单一状态的那种 要小一些。

0%