본문 바로가기

Win32 api

Win32 api 강의 34화.

- 씬 변경 기능 구현.

// func.cpp
...
void ChangeScene(SCENE_TYPE eType)
{
    tEvent event = {};
    event.eType = EVENT_TYPE::SCENE_CHANGE;
    event.lParam = (DWORD_PTR)eType;
    event.wParam = 0;

    CEventMgr::GetInstance()->AddEvent(event);
}

 

범용 함수로 ChangeScene 을 만듦. 인자로는 변경할 SCENE_TYPE 을 받아서 이벤트 처리해줌.

 

// CEventMgr.cpp
void CEventMgr::Execute(const tEvent& event)
{
    switch (event.eType)
    {
    ...
    case EVENT_TYPE::SCENE_CHANGE:
    {
        // lParam: 새 씬의 SCENE_TYPE
        SCENE_TYPE eType = (SCENE_TYPE)event.lParam;
        CSceneMgr::GetInstance()->ChangeScene(eType);
    }
        break;
    default:
        break;
    }
}

 

이벤트 매니저는 해당 타입을 받아서 Scene Manager 에게 넘겨줌. 그럼 안전하게 모든 update, late_update, render 함수들이 호출된 후 씬을 변경할 수 있다.

// CSceneMgr.cpp
...
void CSceneMgr::ChangeScene(SCENE_TYPE eType)
{       
    if (m_pCurScene != nullptr)
    {
        m_pCurScene->Exit();
    }
    CScene* pNewScene = m_arrScene[(UINT)eType];
    if (pNewScene == nullptr)
        return;
    m_pCurScene = pNewScene;
    m_pCurScene->Enter();
}

 

이전 씬의 Exit 처리해주고, 새로운 씬으로 변경 후 Enter 를 호출.

 

// CScene_Start.cpp
...
void CScene_Start::update()
{
    CScene::update();

    if(KEYTAPCHECK(KEY::ENTER))
    {
        ChangeScene(SCENE_TYPE::TOOL);
    }
}

 

각종 씬에서 입력이 들어오면 범용 함수 ChangeScene 을 호출하면 씬 변경이 완료된다.

 

- 씬 변경시 오브젝트 비우기.

// CScene.cpp
...
void CScene::ClearAllObjects()
{
    for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i)
    {
        ClearGroupObjects((GROUP_TYPE)i);
    }
}

void CScene::ClearGroupObjects(GROUP_TYPE eType)
{
    SafeDeleteVector(m_arrObj[(UINT)eType]);
}

 

Scene 클래스에서 각 group 마다 오브젝트들을 지우는 함수들을 만들어줌.

SafeDeleteVector 함수는 func.h 에 선언한 범용 템플릿 함수이며

// func.h
template <typename T>
void SafeDeleteVector(vector<T>& vec)
{
    for (T& item : vec)
    {
        if (item == nullptr)
            continue;
        delete item;
        item = nullptr;
    }
    vec.clear();    
}

 

그냥 인자로 받은 벡터의 원소들을 안전하게 delete 하는 코드를 자주 쓰기 위해 만든 것.

// CScene_Start.cpp
...
void CScene_Start::Exit()
{
    CCollisionMgr::GetInstance()->Reset();
    ClearAllObjects();
}

 

각 씬마다 Exit 함수에서 clear 시키면 씬을 바꿀 때마다 오브젝트를 없애고 넘어갈 수 있다.

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

Win32 api 강의 37 - 38화.  (0) 2025.09.22
Win32 api 강의 35 - 36화.  (0) 2025.09.21
Win32 api 강의 31 - 33화.  (0) 2025.09.19
Win32 api 강의 29 - 30화.  (0) 2025.09.18
Win32 api 강의 27 - 28화.  (0) 2025.09.18