[DirectX] Level 매니저와 Level
in Study on WinAPI&DirectX
LevelMgr 클래스와 Level 클래스 구현하기
CLevelMgr 클래스 구현
// 헤더파일
#pragma once
#include "CSingleton.h"
class CLevel;
class CLevelMgr :
public CSingleton<CLevelMgr>
{
SINGLE(CLevelMgr);
private:
CLevel* m_pCurLevel;
public:
void init();
void tick();
void render();
};
// cpp파일
#include "pch.h"
#include "CLevelMgr.h"
#include "CLevel.h"
#include "CLayer.h"
#include "CGameObject.h"
#include "CTransform.h"
#include "CMeshRender.h"
#include "CPlayerScript.h"
#include "CResMgr.h"
CLevelMgr::CLevelMgr()
: m_pCurLevel(nullptr)
{
}
CLevelMgr::~CLevelMgr()
{
if (nullptr != m_pCurLevel)
delete m_pCurLevel;
}
void CLevelMgr::init()
{
m_pCurLevel = new CLevel;
// 오브젝트 생성
CGameObject* pObj = new CGameObject;
pObj->AddComponent(new CTransform);
pObj->AddComponent(new CMeshRender);
pObj->AddComponent(new CPlayerScript);
Ptr<CMesh> RectMesh = CResMgr::GetInst()->FindRes<CMesh>(L"RectMesh");
Ptr<CGraphicsShader> TestShader = CResMgr::GetInst()->FindRes<CGraphicsShader>(L"TestShader");
pObj->MeshRender()->SetMesh(RectMesh);
pObj->MeshRender()->SetShader(TestShader);
m_pCurLevel->AddGameObject(pObj, 0);
pObj = new CGameObject;
pObj->AddComponent(new CTransform);
pObj->AddComponent(new CMeshRender);
pObj->MeshRender()->SetMesh(RectMesh);
pObj->MeshRender()->SetShader(TestShader);
m_pCurLevel->AddGameObject(pObj, 1);
}
void CLevelMgr::tick()
{
m_pCurLevel->tick();
m_pCurLevel->finaltick();
}
void CLevelMgr::render()
{
m_pCurLevel->render();
}
CLevel 클래스 구현
// 헤더파일
#pragma once
#include "CEntity.h"
class CLayer;
class CGameObject;
class CLevel :
public CEntity
{
private:
CLayer* m_arrLayer[MAX_LAYER];
public:
void tick();
void finaltick();
void render();
public:
void AddGameObject(CGameObject* _Object, int _iLayerIdx);
CLONE(CLevel);
public:
CLevel();
~CLevel();
};
// cpp파일
#include "pch.h"
#include "CLevel.h"
#include "CLayer.h"
CLevel::CLevel()
: m_arrLayer{}
{
for (UINT i = 0; i < MAX_LAYER; ++i)
{
m_arrLayer[i] = new CLayer;
}
}
CLevel::~CLevel()
{
Safe_Del_Array(m_arrLayer);
}
void CLevel::tick()
{
for (UINT i = 0; i < MAX_LAYER; ++i)
{
m_arrLayer[i]->tick();
}
}
void CLevel::finaltick()
{
for (UINT i = 0; i < MAX_LAYER; ++i)
{
m_arrLayer[i]->finaltick();
}
}
void CLevel::render()
{
for (UINT i = 0; i < MAX_LAYER; ++i)
{
m_arrLayer[i]->render();
}
}
void CLevel::AddGameObject(CGameObject* _Object, int _iLayerIdx)
{
m_arrLayer[_iLayerIdx]->AddGameObject(_Object);
}
CLayer 클래스 구현
각 레벨을 레이어 그룹으로 관리하기 위해서 레이어 클래스를 생성해준다.
우선 define 헤더에 아래 코드를 추가한다.
#define MAX_LAYER 32
// 헤더파일
#pragma once
#include "CEntity.h"
class CGameObject;
class CLayer :
public CEntity
{
private:
vector<CGameObject*> m_vecObject;
public:
void tick();
void finaltick();
void render();
public:
void AddGameObject(CGameObject* _Object) { m_vecObject.push_back(_Object); }
CLONE(CLayer)
public:
CLayer();
~CLayer();
};
// cpp파일
#include "pch.h"
#include "CLayer.h"
#include "CGameObject.h"
CLayer::CLayer()
{
}
CLayer::~CLayer()
{
Safe_Del_Vec(m_vecObject);
}
void CLayer::tick()
{
for (size_t i = 0; i < m_vecObject.size(); ++i)
{
m_vecObject[i]->tick();
}
}
void CLayer::finaltick()
{
for (size_t i = 0; i < m_vecObject.size(); ++i)
{
m_vecObject[i]->finaltick();
}
}
void CLayer::render()
{
for (size_t i = 0; i < m_vecObject.size(); ++i)
{
m_vecObject[i]->render();
}
}
CTransform 코드의 변경
UpdataData 함수를 Transform 클래스로 보낸다.
// transform.cpp 파일
#include "pch.h"
#include "CTransform.h"
#include "CDevice.h"
#include "CConstBuffer.h"
CTransform::CTransform()
: CComponent(COMPONENT_TYPE::TRANSFORM)
{
}
CTransform::~CTransform()
{
}
void CTransform::finaltick()
{
}
void CTransform::UpdateData()
{
// 위치값을 상수버퍼에 전달 및 바인딩
CConstBuffer* pTransformBuffer = CDevice::GetInst()->GetConstBuffer(CB_TYPE::TRANSFORM);
pTransformBuffer->SetData(&m_vRelativePos, sizeof(Vec3));
pTransformBuffer->UpdateData();
}