본문 바로가기

Win32 api

Win32 api 강의 62화.

- 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