씬 전환의 기본 틀
05. Scene -> Scene_Tool -> CScene_Tool.h (new)
#pragma once
#include "CScene.h"
class CScene_Tool :
public CScene
{
private:
public:
virtual void Enter();
virtual void Exit();
public:
CScene_Tool();
~CScene_Tool();
};
05. Scene -> Scene_Tool -> CScene_Tool.cpp (new)
#include "pch.h"
#include "CScene_Tool.h"
CScene_Tool::CScene_Tool()
{
}
CScene_Tool::~CScene_Tool()
{
}
void CScene_Tool::Enter()
{
}
void CScene_Tool::Exit()
{
}
01. Header -> Func.h
#pragma once
class CObject;
void CreateObject(CObject* _pObj, GROUP_TYPE _eGroup);
void DeleteObject(CObject* _pObj);
//new
void ChangeScene(SCENE_TYPE _eNext);
01. Header -> Func.cpp
#include "pch.h"
#include "func.h"
#include "CEventMgr.h"
void CreateObject(CObject* _pObj, GROUP_TYPE _eGroup)
{
tEvent evn = { };
evn.eEven = EVENT_TYPE::CREATE_OBJECT;
evn.lParam = (DWORD_PTR)_pObj;
evn.wParam = (DWORD_PTR)_eGroup;
CEventMgr::GetInst()->AddEvent(evn);
}
void DeleteObject(CObject* _pObj)
{
tEvent evn = { };
evn.eEven = EVENT_TYPE::DELETE_OBJECT;
evn.lParam = (DWORD_PTR)_pObj;
CEventMgr::GetInst()->AddEvent(evn);
}
//new
void ChangeScene(SCENE_TYPE _eNext)
{
tEvent evn = { };
evn.eEven = EVENT_TYPE::SCENE_CHANGE;
evn.lParam = (DWORD_PTR)_eNext;
CEventMgr::GetInst()->AddEvent(evn);
}
05. Scene -> Scene_Start -> CScene_Start.h
#pragma once
#include "CScene.h"
class CScene_Start :
public CScene
{
public:
//new
virtual void update();
virtual void Enter();
virtual void Exit();
public:
CScene_Start();
~CScene_Start();
};
05. Scene -> Scene_Start -> CScene_Start.cpp
...
#include "CCollisionMgr.h"
//new
#include "CKeyMgr.h"
...
//new
void CScene_Start::update()
{
// 부모에 있는 update 호출
CScene::update();
// 아래는 Start Scene의 고유한 코드들
if (KEY_TAP(KEY::ENTER))
{
ChangeScene(SCENE_TYPE::TOOL);
}
}
...
03. Manager -> SceneMgr -> CSceneMgr.h
...
//new: 아무나 막 호출하면 안된다.
private:
void ChangeScene(SCENE_TYPE _eNext);
friend class CEventMgr;
};
03. Manager -> SceneMgr -> CSceneMgr.cpp
#include "pch.h"
#include "CSceneMgr.h"
#include "CScene_Start.h"
//new
#include "CScene_Tool.h"
#include "CEventMgr.h"
...
void CSceneMgr::init()
{
m_arrScene[(UINT)SCENE_TYPE::START] = new CScene_Start;
m_arrScene[(UINT)SCENE_TYPE::START]->SetName(L"Start Scene");
//new
m_arrScene[(UINT)SCENE_TYPE::TOOL] = new CScene_Tool;
m_arrScene[(UINT)SCENE_TYPE::TOOL]->SetName(L"Tool Scene");
m_pCurScene = m_arrScene[(UINT)SCENE_TYPE::START];
m_pCurScene->Enter();
}
...
//new: 진자 씬 변경을 위한 로직
void CSceneMgr::ChangeScene(SCENE_TYPE _eNext)
{
}
03. Manager -> EventMgr -> CEventMgr.cpp
...
void CEventMgr::Excute(const tEvent& _eve)
{
switch (_eve.eEven)
{
case EVENT_TYPE::CREATE_OBJECT:
{
CObject* pNewObj = (CObject*)_eve.lParam;
GROUP_TYPE eType = (GROUP_TYPE)_eve.wParam;
CSceneMgr::GetInst()->GetCurScene()->AddObject(pNewObj, eType);
}
break;
case EVENT_TYPE::DELETE_OBJECT:
{
CObject* pDeadObj = (CObject*)_eve.lParam;
pDeadObj->SetDead();
m_vecDead.push_back(pDeadObj);
}
break;
case EVENT_TYPE::SCENE_CHANGE:
//new
CSceneMgr::GetInst()->ChangeScene((SCENE_TYPE)_eve.lParam);
break;
}
}
엔터키 씬 변환
01. Header -> func.h
...
//new
template<typename T>
void Safe_Delete_Vec(vector<T>& _vec)
{
for (size_t i = 0; i < _vec.size(); ++i)
{
if (nullptr != _vec[i])
delete _vec[i];
}
_vec.clear();
}
05. Scene -> CScene.h
...
public:
void SetName(const wstring& _strName) { m_strName = _strName; }
const wstring& GetName() { return m_strName; }
//old
/*void update();
void finalupdate();
void render(HDC _dc);*/
//new
virtual void update();
virtual void finalupdate();
virtual void render(HDC _dc);
virtual void Enter() = 0;
virtual void Exit() = 0;
public:
void AddObject(CObject* _pObj, GROUP_TYPE _eType)
{
m_arrObj[(UINT)_eType].push_back(_pObj);
}
const vector<CObject*>& GetGroupObject(GROUP_TYPE _eType) { return m_arrObj[(UINT)_eType]; }
//new
void DeleteGroup(GROUP_TYPE _eTarget);
void DeleteAll();
public:
CScene();
virtual ~CScene();
};
05. Scene -> CScene.cpp
...
//new
void CScene::DeleteGroup(GROUP_TYPE _eTarget)
{
//new
/*for (size_t i = 0; i < m_arrObj[(UINT)_eTarget].size(); ++i)
{
delete m_arrObj[(UINT)_eTarget][i];
}
m_arrObj[(UINT)_eTarget].clear();*/
//new2: template 화해서 func에 모듈화
Safe_Delete_Vec<CObject*>(m_arrObj[(UINT)_eTarget]);
}
//new
void CScene::DeleteAll()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i)
{
DeleteGroup((GROUP_TYPE)i);
}
}
05. Scene -> Scene_Start -> CScene_Start.cpp
...
void CScene_Start::Exit()
{
//new
DeleteAll();
//new
CCollisionMgr::GetInst()->Reset();
}
03. Manager -> SceneMgr -> CSceneMgr.cpp
...
void CSceneMgr::ChangeScene(SCENE_TYPE _eNext)
{
//new
m_pCurScene->Exit();
//new
m_pCurScene = m_arrScene[(UINT)_eNext];
//new
m_pCurScene->Enter();
}
ToolScene에도 적용
05. CScene -> Scene_Tool -> CScene_Tool.h
...
class CScene_Tool :
public CScene
{
private:
public:
//new
virtual void update();
...
};
05. CScene -> Scene_Tool -> CScene_Tool.cpp
#include "pch.h"
#include "CScene_Tool.h"
//new
#include "CKeyMgr.h"
...
//new
void CScene_Tool::update()
{
CScene::update();
if (KEY_TAP(KEY::ENTER))
{
ChangeScene(SCENE_TYPE::START);
}
}
...
반응형