-
Notifications
You must be signed in to change notification settings - Fork 0
State Pattern & FSM
객체의 행동을 상태별로 정의하는 패턴. 내부 인터페이스 상태가 변할때마다 행동 또한 변화한다.
같은 행동이라도 객체의 '상태'에 따라서 다른 반응을 보여야 할 때 쓰인다.
유저가 자신의 상태에 따라 공격이나 방어를 해야 할 경우에 쓰일 수 있다.
#pragma once
#include <stdio.h>
class IState {
private:
public:
IState() {};
~IState() {};
virtual void action() = 0;
};
class AttackState : public IState {
private:
public:
AttackState() {}
virtual ~AttackState() {}
void action() override {
printf("공격\n");
}
};
class DefenceState : public IState {
private:
public:
DefenceState() {}
virtual ~DefenceState() {}
void action() override {
printf("방어\n");
}
};
class User{
private:
IState* state;
public:
User() {};
~User() {};
void action() {
state->action();
}
void setState(IState* _state) {
state = _state;
}
};
int main() {
User* user = new User();
user->setState(new AttackState());
user->action();
user->setState(new DefenceState());
user->action();
return 0;
}- 객체의 상태를 매번 체크하고 조건별로 처리하는 불필요한 if문들을 간결하게 줄일 수 있다.
- 상태에 따른 코드가 각 클래스로 캡슐화되어있기 때문에 유지보수에 용이하다
유한 상태 기계라는 의미로, 게임에서 주로 쓰여진다. 주어진 상황 안에서 벌어질수 있는 유한한 갯수의 상태를 구현하고 특정 Event의 발생마다 상태를 변경(Transition)해주거나 출력 또는 액션을 보여주는 장치를 의미하는 모델이다. 위에서 소개한 State Pattern을 이용하여 좀 더 편리하게 구현할 수 있다.
- 손쉽게 도표로 나타낼 수 있다.
- 상태별로 각자 코드가 분리되어 있기 때문에 상태별 코드 관리에 용이하다.
-
Scene Manager
-
Scene Manager는 추상 Scene을 갖고있고, 매 프레임마다 Scene을 draw 및 update해준다.
-
Scene을 상속받아 구현된 MainScene, GameScene, EndScene을 특정 Event마다 SceneManager.setScene을 통해 상태를 변경해준다.
-
게임의 메인 플로우 (메인화면 - 게임화면 - 게임 오버 화면)을 컨트롤해야할때 용이하게 쓰일수 있음.
-
ex) cocos2dx의 Director (Scene 관리)
-
유저 시나리오
-
매번 유저에게 선택지를 준다. 필드 A, B중 어디로 가시겠습니까??
-
유저의 결정에 따라 해당하는 필드로 상태를 변경하고, 해당 상태의 로직으로 유저에게 새로운 엿을 선물해준다.
-
ex) 머드 게임
-
Unity Mechanim (Animation System)
-
-
여러 애니메이션을 개발자가 상태를 지정하여, 현재 상태에 맞는 애니메이션이 진행되도록 손쉽게 만들 수 있다.
