사용자 입력에 따라 상태를 변환할 때 사용하는 패턴이다.
FSM 이라는 유한상태기계를 구현하는 방법이다.
걷기, 점프, 달리기 등 여러 상태가 존재하는데 이를 분기문으로 처리하려면 bool변수도 그렇고 너무 복잡해진다.
이를 상태에 따라 깔끔하게 구현가능하게 해주는 것이 상태패턴이다.
우선 열거형으로 상태를 정의할 수 있다.
그리고 이를 switch문으로 분기해서 코드를 모아둘 수 있다.
이정도로도 충분할 수 있지만
'게임 프로그램이 패턴' 책에서는 각 상태를 클래스로 만들었다.
상태 인터페이스를 만들고 각 상태는 이를 상속한다.
interface heroState
{
virtual void update()
virtual void handleinput()
static walkState;
static runState;
}
이런식으로 만든다.
class walkState : heroState
{
virtual void handleinput()
{
// 바꾸는 코드
}
virtual void update()
{
// 위치 이동
}
}
각 상태는 이렇게 인터페이스를 상속해 구현한다.
class hero
{
virtual void handleInput(Input input)
{
state->handleInput(input)
}
virtual void Update()
{
state->update();
}
herostate state;
}
플레이어 클래스에서는 herostate라는 클래스를 하나 가지고 있으며 상태를 state의 handleinput 에서 입력에 따라 바꾼다.
이는
interface heroState
{
virtual void update()
virtual void handleinput(input)
{
if(input==run)
hero.state = herostate.runState;
}
static walkState;
static runState;
}
이렇게 해놓으면 각 state를 한개씩 가지고 있으며 hero클래스에서 state를 바꿔주면 자연스레 그 state의 update가 실행되며 동작이 바뀌게 된다.
하지만 ai같은 곳에선 이 상태패턴 대신 행동트리나 계획시스템을 많이 사용한다고 한다.
플레이어에 적용할만 한 것 같다.