状态机:就是指定系统的所有可能的状态及状态间跳转的条件,然后设一个初始状态输入给这台机器,机器就会自动运转,或最后处于终止状态,或在某一个状态不断循环。
游戏中状态切换是很频繁的。 可能以前要切换状态就是if~else,或者设标志,但这些都不太结构化, 如果把它严格的设为一种标准的状态机,会清楚的多。
比如控制一扇门的运动, 初始时门是关的, 当有力作用在门上时, 门开始慢慢打开,力的作用完后,门渐渐停止不动, 当有反向的力时,门又渐渐关上, 知道回到初始关的状态。 这个你会怎么来编程实现呢。 似乎很麻烦, 的确,没有状态机的思想时会很烦,设很多标志,一堆if条件。
用状态机的话,不只是代码更清晰, 关键是更符合逻辑和自然规律, 不同状态不同处理, 满足条件则跳转到相关状态。
伪码如下:
enum
{
CLOSED, // 关上状态
CLOSING, // 正在关状态
OPENED, // 打开状态
OPENING, // 正在开的状态
}doorState = CLOSED; // 初始为关
Update()
{
switch(doorState)
case CLOSED:
if (有人推门)
doorState = OPENING; // 跳转到正在开状态
break;
case OPENING:
door.Rotation += DeltaAngle; // 门的旋转量递增
if (门的速度为零) / / 力的作用已去
doorState = OPENED; // 跳转到开状态
break;
case OPENED:
if (有人关门)
doorState = CLOSING;
break;
case CLOSING:
door.Rotation -= DeltaAngle; // 门的旋转量递减
if (门的旋转角度减为零)
doorState = CLOSED; // 门已关上
break;
}