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() { }
'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 |