본문 바로가기

게임프로그래밍/C++ 게임 클라

[WinApi] 16 - Scene

씬 전환의 기본 틀

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);
	}
}
...

 

반응형