[DirectX] DirectX 기본 엔진 구성 코드
in Study on WinAPI&DirectX
Engine의 코드 구성 정리
헤더파일 구성
pch.h
#ifndef PCH_H
#define PCH_H
// 여기에 미리 컴파일하려는 헤더 추가
#include "framework.h"
#include <stdlib.h>
#include <Windows.h>
#include <vector>
#include <string>
#include "global.h"
using namespace std::vector;
using namespace std::list;
using namespace std::map;
using namespace std::make_pair;
using nmmespace std::wstring;
using nmmespace std::string;
#endif //PCH_H
pch.cpp
#include "pch.h"
특별한 코드는 없다. 하지만 나머지 파일들에 대해서는 미리 컴파일된 헤더를 만들기 설정하고, pch.cpp에 대해서는 미리 컴파일된 헤더 사용 설정을 해놓아야 한다.
global.h
#pragma once
#include <wrl.h>
using namespace Microsoft::WRL;
#include <d3d11.h> // DirectX11
#include <d3dcompiler.h> // Shader 컴파일
#include <DirectXMath.h> // DX Math
#include <DirectXPackedVector.h>
using namespace DirectX;
using namespace DirectX::PackedVector;
#pragma comment(lib, "d3d11")
#pragma comment(lib, "d3dcompiler")
#include "SimpleMath.h"
using namespace DirectX::SimpleMath;
typedef Vector2 Vec2;
typedef Vector3 Vec3;
typedef Vector4 Vec4;
#include "struct.h"
#include "CSingleton.h"
struct.h
SimpleMath 헤더파일이 없을 경우 Vec2를 구현을 해놓는 코드이다.
현재는 SimpleMath 헤더를 사용하기 때문에 따로 필요없는 헤더이다.
#pragma once
struct Vec2
{
float x;
float y;
public:
Vec2()
: x(0.f)
, y(0.f)
{}
Vec2(float _x, float _y)
: x(_x)
, y(_y)
{
}
};
Vec2 등 사용자 지정 자료형을 사용하기 위한 헤더파일이다.
Engine 클래스 구성
엔진 클래스를 구성하는 헤더파일과 cpp파일 기본 코드 정리
CEngine.h
#pragma once
class CEngine
: public CSingleton<CEngine>
{
private:
HWND m_hWnd;
// 윈도우 해상도
Vec2 m_vResolution;
public:
Vec2 GetWindowResolution() { return m_vResolution; }
public:
int init(HWND _hWnd, UINT _iWidth, UINT _iHeight);
void progress();
private:
void tick();
void render();
public:
CEngine();
~CEngine();
};
CEngine.cpp
#include "pch.h"
#include "CEngine.h"
#include "CDevice.h"
#include "CPathMgr.h"
#include "CKeyMgr.h"
CEngine::CEngine()
: m_hWnd(nullptr)
{
}
CEngine::~CEngine()
{
}
int CEngine::init(HWND _hWnd, UINT _iWidth, UINT _iHeight)
{
// 메인 윈도우 핸들
m_hWnd = _hWnd;
m_vResolution = Vec2((float)_iWidth, (float)_iHeight);
// 해상도에 맞는 작업영역 크기 조정
RECT rt = { 0, 0, (int)_iWidth, (int)_iHeight};
AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, false);
SetWindowPos(m_hWnd, nullptr, 10, 10, rt.right - rt.left, rt.bottom - rt.top, 0);
ShowWindow(m_hWnd, true);
// Device 초기화
if (FAILED(CDevice::GetInst()->init(m_hWnd, _iWidth, _iHeight)))
{
MessageBox(nullptr, L"Device 초기화 실패", L"에러", MB_OK);
return E_FAIL;
}
// Manager 초기화
CPathMgr::GetInst()->init();
CKeyMgr::GetInst()->init();
return S_OK;
}
void CEngine::progress()
{
tick();
render();
}
void CEngine::tick()
{
CTimeMgr::GetInst()->tick();
CKeyMgr::GetInst()->tick();
}
void CEngine::render()
{
// 렌더 시작 및 코드
// 렌더 종료
CDevice::GetInst()->Present();
}
이 글을 작성한 11월 29일 기준 기본 구성은 이렇고, 앞으로 기능이 추가됨에 따라서 헤더파일이 추가되고 코드도 추가될 것이다.