状态机
之前写过的一个项目将状态机和每个状态的处理都写到了同一个代码文件中,为了让后期代码不那么混乱,肯定要将状态机独立出来。
于是,我们可以让状态机作为根节点,包含一系列的状态子节点。
State
先从最底层思考起,一个状态应该是怎样的?
- 首先,进入该状态要进行怎样的操作。
- 其次,在状态每一帧要进行怎样的操作
- 同时,每一帧判断是否要更新到下一个状态
- 最后,退出该状态要进行的操作
1 | extends Node |
State_machine
state_machine要如何获取到所有的节点呢。一种做法是没增加一个状态就在state_machine中手动添加。还有一种更方便的做法是遍历所有state_machine的子节点,将状态存储起来。
- 也就是这样
1 | func _ready() -> void: |
状态操作
由于在状态中我们已经实现了每一帧中状态要进行的操作,所以在状态机中只需要调用就行了。
- 这样
1 | func _process(delta: float) -> void: |
状态更新
获取到状态节点的更新状态请求时,先判断一下给出的状态是否都存在。如果存在,进行上一个状态的退出操作,以及下一个状态的进入操作
1 | func switch_state(last_state : State, next_state_name): #这里的newState是字符串,需要在states里找,因为该函数要在State中调用,每个State不好获取同级的其他State |
总结
状态机的思想非常好用,可以简化很多问题。
比如,它可以实现一段代码逐步执行。只需要将每一行代码看作是一个状态,某一行代码运行后判断下一个状态(也就是代码行)是哪一个。这样就可以手动控制代码的运行,在每一行代码运行时,也可以进行很多操作。比如,在可视化排序的过程中,可以将排序过程画出来。