规则:
- 拥有一组状态,并且可以在这组状态之间进行切换。
- 状态机同一时刻只能处于一种状态。
- 状态机会接收一组输入或者事件。
- 每一个状态有一组转换,每一个转换都关联着一个输入并指向另一个状态。
简而言之,整个状态机可以分为:状态、输入和转换。
实现1:枚举和分支
可以使用枚举来表示状态,并且使用分支来进行状态切换。
enum State {
STATE_STANDING,
STATE_JUMPING,
STATE_DUCKING,
STATE_DIVING
};
enum Input {
PRESS_A,
PRESS_B
};
class Hero {
private state: State;
constructor(parameters) {
}
handleInput(input: Input): void {
switch (this.state) {
case State.STATE_STANDING:
if (input == Input.PRESS_B) {
this.state = State.STATE_JUMPING;
// do something
}
break;
case State.STATE_JUMPING:
if (input == Input.PRESS_A) {
this.state = State.STATE_DIVING;
// do something
}
break;
// ...
default:
break;
}
}
}
FSM适用场景:
- 你有一个游戏实体,它的行为基于它的内部状态而改变。
- 这些状态被严格划分为相对数目较少的小集合。
- 游戏实体随着时间的变化会响应用户输入和一些游戏事件。