개발 지식/디자인패턴

상태 패턴

게임만드는학생 2025. 4. 19. 18:23

사용자 입력에 따라 상태를 변환할 때 사용하는 패턴이다. 

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같은 곳에선 이 상태패턴 대신 행동트리나 계획시스템을 많이 사용한다고 한다.

플레이어에 적용할만 한 것 같다. 

'개발 지식 > 디자인패턴' 카테고리의 다른 글

게임 루프 패턴  (0) 2025.04.21
이중버퍼  (0) 2025.04.21
싱글턴 패턴  (1) 2025.04.19
관찰자 패턴  (0) 2025.04.18
경량 패턴  (0) 2025.04.18