### State 不好的代码 ``` //处理玩家输入的代码 void Heroine::handleInput(Input input) { if (input == PRESS_B) { if (!isJumping_ && !isDucking_) { // Jump... } } else if (input == PRESS_DOWN) { if (!isJumping_) { isDucking_ = true; setGraphics(IMAGE_DUCK); } else { isJumping_ = false; setGraphics(IMAGE_DIVE); } } else if (input == RELEASE_DOWN) { if (isDucking_) { // Stand... } } } ``` FSM ``` 1 machine有几种状态 2 同一时间machine只有一种状态 3 一系列的输入和事件发送给machine 4 状态切换 ``` ``` class IState{ virtual void HandleInput() = 0; } class State1: IState { void HandleInput(){} } class Hero { IState state; void HandleInput(){ this.state.HandleInput(); } } // 可使用多个状态机在hero身上 void Heroine::handleInput(Input input) { state_->handleInput(*this, input); equipment_->handleInput(*this, input); } ``` ###状态机的目的是将某一种状态的所有处理封装到一个类里 ##缺点 ``` 复杂ai(状态机不适用) 状态历史(use state stack 解决) ```