Software Development/Graphics

4. DirectX 프레임워크(framework)

huiyu 2014. 10. 14. 22:54

1. 프레임워크란?

     프레임워크란 골격이라는 의미로 코드를 작성하기 위해 제공되는 틀을 말합니다. 


2. 프레임워크 구조

 코드는 크게 Direct3D셋업에 대한 클래스와 게임에 관한 코드로 구분할 수 있습니다.

셋업클래스는 게임프로그래머에게 공통된 환경을 제공하고,

게임 코드를 작성하는 클래스는 이 클래스를 상속하여 사용합니다. 게임 코드는 실제 게임과 관련된 내용만 들어갑니다.


3. 셋업클래스 생성

 위 이미지와 같이 선택 후 클래스 파일을 하나 생성합니다. 그리고 다음과 같이 코딩합니다.

 이 클래스는 전부 셋업과 해제에 관한 내용이며, InitD3D(), Render(), Cleanup()은 클래스의 멤버함수가 되고, g_pD3D변수와 g_pd3dDevice는 클래스의 멤버변수가 됩니다.

 InitD3d(), Render(), Cleanup()함수는 모두 WinMain()과 WndProc()에서 셋업되는 함수입니다. 이들 함수의 내용은 가장 기초적인 호출이며 게임 구조에 해당이 됩니다. 그래서 이들 함수가 호출되었을 때 같이 처리해야 할 게임 코드도 호출되어야 하며, 이를 일반적으로 콜백함수(callback)라고 합니다.

 이들은 여기서 OnInit(), OnRender(), OnUpdate(), OnRelease()함수로 상위에서 하위의 함수를 호출하므로 가상함수가 사용되야 합니다. 또한 하위에서 상속 받아 실행될 수 있게 하기 위해 순수가상함수로 지정해야 합니다.

- 헤더파일 코드

#pragma once
#include <d3d9.h>

class CD3DApp
{
protected:
	LPDIRECT3D9			m_pD3D;
	LPDIRECT3DDEVICE9	m_pd3dDevice;
	HWND m_hWnd;

protected:
	virtual void OnInit()	 = 0;
	virtual void OnRender()	 = 0;
	virtual void OnUpdate()  = 0;
	virtual void OnRelease() = 0;

public:
	HRESULT InitD3D(HWND hWnd);
	void Render();
	void Update();
	void Cleanup();

public:
	CD3DApp(void);
	~CD3DApp(void);
};


- cpp파일

#include "StdAfx.h"
#include "D3DApp.h"


CD3DApp::CD3DApp(void)
{
}


CD3DApp::~CD3DApp(void)
{
}

//DirectX 초기화 소스
HRESULT CD3DApp::InitD3D(HWND hWnd)
{
	if(NULL  == (m_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
		return E_FAIL;

	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));
	d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

	if(FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pd3dDevice)))
	{
		return E_FAIL;
	}
	OnInit();
	return S_OK;
}

//렌더링 소스
VOID CD3DApp::Render()
{
	if(NULL == m_pd3dDevice)
		return;

	//Clear the backbuffer to a blue color
	m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);

	//Begin the scene
	if(SUCCEEDED(m_pd3dDevice->BeginScene()))
	{
		//Rendering of scene objects can happen here
		OnRender();
		//End the scene
		m_pd3dDevice->EndScene();
	}

	//present the backbuffer contents to the display
	m_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

VOID CD3DApp::Update()
{
	OnUpdate();
}

VOID CD3DApp::Cleanup()
{
	OnRelease();
	if(m_pd3dDevice != NULL)
		m_pd3dDevice->Release();

	if(m_pD3D != NULL)
		m_pD3D->Release();
}


4. 콜백함수 클래스

 실제 게임코드를 작성하기 위한 클래스로, 셋업클래스를 상속받고, OnInit(), OnUpdate(), OnRender(), OnRelease()함수를 재정의하고 코드를 작성합니다.

 마찬가지로 새 클래스를 생성한 뒤, 아래의 코드를 입력합니다.


- 헤더파일

#pragma once
#include "D3DApp.h"

class CGameEdu01 : public CD3DApp
{
	virtual void OnInit();
	virtual void OnRender();
	virtual void OnUpdate();
	virtual void OnRelease();
public:
	CGameEdu01(void);
	~CGameEdu01(void);
};


-cpp파일

#include "StdAfx.h"
#include "GameEdu01.h"


CGameEdu01::CGameEdu01(void)
{
}


CGameEdu01::~CGameEdu01(void)
{
}


void CGameEdu01::OnInit()
{
}

void CGameEdu01::OnRender()
{
}

void CGameEdu01::OnUpdate()
{
}

void CGameEdu01::OnRelease()
{
}


728x90

'Software Development > Graphics' 카테고리의 다른 글

5. Vertices_2)정점  (0) 2014.10.17
5. Vertices_1)Vector  (0) 2014.10.17
3. DirectX 기본환경 설정  (0) 2014.10.14
2. DirectX 설치, VisualStudio 2010 설정, 프로젝트 생성  (1) 2014.10.07
1. 3D 기초 용어  (0) 2014.10.06