본문 바로가기

Win32 api

Win32 api 15 - 16화.

- Scene 과 SceneManager 설계.

#pragma once
// forward declare
class CObject;

class CScene
{
private:
    vector<CObject*>    m_arrObj[(UINT)GROUP_TYPE::END];
    wstring             m_strName;

public:
    void SetName(const wstring& name) { m_strName = name; }
    const wstring& GetName() const { return m_strName; }

public:
    CScene();
    virtual ~CScene();
};

 

구조만 잡아놓음. 

virtual 소멸자는 상속을 통해 다형성을 구현할 Base 클래스에 반드시 선언해줘야 함.

 

#pragma once
class CScene;

class CSceneMgr
{
    SINGLETON(CSceneMgr);
private:
    CScene* m_arrScene[(UINT)SCENE_TYPE::END];
    CScene* m_pCurScene;
public:
    void init();
};

 

Scene 을 관리할 관리자 클래스도 마찬가지로 싱글톤으로 선언. 

 

근데 씬 관리를 왜 벡터로 안하고 단순 배열로 하는지 모르겠음. 강의를 좀더 봐야겠다.

 

- CCore 구조 수정

void CCore::progress()
{
    // Manager Update
    CTimeMgr::GetInstance()->update();
    CKeyMgr::GetInstance()->update();
    CSceneMgr::GetInstance()->update();

    // update();
    render();
}
void CCore::render()
{
    // 이전 화면 지우기
    Rectangle(m_hDCBack, -1, -1, m_ptResolution.x + 1, m_ptResolution.y + 1);

    //
    CSceneMgr::GetInstance()->render(m_hDCBack);
    
    BitBlt(m_hDC,
        0, 0, m_ptResolution.x, m_ptResolution.y,
        m_hDCBack,
        0, 0,
        SRCCOPY);
}

 

CCore 는 본격적으로 관리자 객체들에게 일을 떠넘긴다. update 나 render 를 하위 객체들에게 넘김.

 

- Scene 추상 클래스화.

// CScene.h
class CScene
{
    ...

    virtual void Enter() PURE;
    virtual void Exit() PURE;

protected:
    inline void AddObject(CObject* obj, GROUP_TYPE eType)
    {
        if (obj == nullptr)
            return;
        m_arrObj[(UINT)eType].push_back(obj);
    }
    ...
};

 

PURE 는 그냥 전처리기로 = 0 을 뜻함. 순수 가상 함수를 선언할 때 쓰면 가독성이 좋을 듯.

AddObject 메소드는 protected 로 선언해서 상속 클래스들에서 사용 가능하도록 함.

 

- 개략적인 프레임워크 완성

void CSceneMgr::update()
{
    if (m_pCurScene == nullptr)
        return;

    for(UINT i = 0; i < (UINT)SCENE_TYPE::END; ++i)
    {
        if(m_arrScene[i] == nullptr)
            continue;
        if (m_arrScene[i] != m_pCurScene)
            continue;

        m_pCurScene->update();
    }
}

void CSceneMgr::render(HDC hDC)
{
    if (m_pCurScene == nullptr)
        return;

    for (UINT i = 0; i < (UINT)SCENE_TYPE::END; ++i)
    {
        if (m_arrScene[i] == nullptr)
            continue;
        if (m_arrScene[i] != m_pCurScene)
            continue;
        m_pCurScene->render(hDC);
    }
}

 

SceneManager → Scene → Object 순으로 호출되며 매 프레임마다 매 씬들의 모든 오브젝트들의

update 와 render 가 돌아가게 됨.

'Win32 api' 카테고리의 다른 글

Win32 api 강의 21 - 22화.  (0) 2025.09.16
Win32 api 강의 17 - 18화.  (0) 2025.09.15
Win32 api 강의 13 - 14화.  (0) 2025.09.14
Win32 api 강의 12화.  (0) 2025.09.13
Win32 api 강의 11화.  (0) 2025.09.13