- State 패턴 설계.
// AI.h
...
class AI
{
private:
map<STATE_TYPE, CState*> m_mapState; // 상태 맵.
CState* m_pCurrentState; // 현재 상태.
CMonster* m_pOwner; // 소유자 몬스터.
private:
void AddState(CState* pState);
void ChangeState(STATE_TYPE eType);
void Update();
void SetOwner(CMonster* pOwner) { m_pOwner = pOwner; }
public:
CMonster* GetOwner() const { return m_pOwner; }
CState* GetCurrentState() const { return m_pCurrentState; }
public:
AI();
~AI();
friend class CMonster;
};
디자인 패턴 중 State 패턴에 따라 State 클래스와 AI 클래스를 설계함.
AI 는 State 를 맵에 저장하고 관리함. 일단 Monster 클래스에서 AI 를 통해 행동을 처리하도록 함.
// CState.h
...
class CState
{
private:
AI* m_pOwner;
STATE_TYPE m_eState;
public:
AI* GetOwner() const { return m_pOwner; }
STATE_TYPE GetType() const { return m_eState; }
private:
virtual void Enter() PURE;
virtual void Update() PURE;
virtual void Exit() PURE;
void SetOwner(AI* pOwner) { m_pOwner = pOwner; }
public:
CState(STATE_TYPE eState);
virtual ~CState();
friend class AI;
};
State 패턴의 특징이다. 각 State 는 시작할 때 호출되는 Enter, 프레임마다 호출되는 Update, 교체 시 호출되는 Exit 함수를 구현함.
// AI.cpp
...
void AI::ChangeState(STATE_TYPE eType)
{
auto iter = m_mapState.find(eType);
if (iter == m_mapState.end())
return;
if (m_pCurrentState)
m_pCurrentState->Exit();
m_pCurrentState = iter->second;
m_pCurrentState->Enter();
}
void AI::Update()
{
if (m_pCurrentState)
m_pCurrentState->Update();
}
AI 에서는 이 Current State 를 교체할 때마다 적절히 Enter, Exit 함수를 호출해준다.
그리고 매 프레임마다 Update 를 호출하는 구조.
State → IdleState → BossIdleState 와 같이 다양하게 파생될 수 있음.
'Win32 api' 카테고리의 다른 글
| Win32 api 강의 64 - 65화. (0) | 2025.10.02 |
|---|---|
| Win32 api 강의 63화. (0) | 2025.10.01 |
| Win32 api 강의 59 - 61화. (0) | 2025.09.30 |
| Win32 api 강의 57 - 58화. (0) | 2025.09.29 |
| Win32 api 강의 55 - 56화. (0) | 2025.09.29 |