DirectX 9.0 3d 初始程序框架
2009-04-28 13:57
288 查看
这个是《DirectX 9.0 3D游戏开发编程基础》上第二章的的框架,很有参考意义,框架分3个文件,主逻辑在
d3dInit.cpp中。
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File:
d3dUtility.h
//
// Author: Frank
Luna (C) All Rights Reserved
//
// System: AMD
Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides
utility functions for simplifying common tasks.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __d3dUtilityH__
#define __d3dUtilityH__
#include <d3dx9.h>
#include <string>
#include <tchar.h>
using namespace std;
namespace d3d
{
bool InitD3D(
HINSTANCE hInstance,
// [in] Application instance.
int width,
int height, // [in]
Backbuffer dimensions.
bool windowed, // [in]
Windowed (true)or full screen (false).
D3DDEVTYPE deviceType,
// [in] HAL or REF
IDirect3DDevice9** device);// [out]The
created device.
int EnterMsgLoop(
bool (*ptr_display)(float timeDelta));
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
template<class T> void Release(T t)
{
if( t
)
{
t->Release();
t = 0;
}
}
template<class T> void Delete(T t)
{
if( t
)
{
delete t;
t = 0;
}
}
}
#endif // __d3dUtilityH__
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File:
d3dUtility.cpp
//
// Author: Frank
Luna (C) All Rights Reserved
//
// System: AMD
Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides
utility functions for simplifying common tasks.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "d3dUtility.h"
bool d3d::InitD3D(
HINSTANCE hInstance,
int width,
int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device)
{
//
// Create the main application window.
//
WNDCLASS wc;
wc.style = CS_HREDRAW
| CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0,
IDI_APPLICATION);
wc.hCursor = LoadCursor(0,
IDC_ARROW);
wc.hbrBackground
= (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName
= _T("Direct3D9App");
if( !RegisterClass(&wc) )
{
::MessageBox(0, _T("RegisterClass()
- FAILED"), 0, 0);
return false;
}
HWND hwnd
= 0;
hwnd = ::CreateWindow(_T("Direct3D9App"), _T("Direct3D9App"),
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance,
0 /*extra*/);
if( !hwnd
)
{
::MessageBox(0, _T("CreateWindow()
- FAILED"), 0, 0);
return false;
}
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);
//
// Init D3D:
//
HRESULT hr = 0;
// Step 1: Create the IDirect3D9
object.
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
::MessageBox(0, _T("Direct3DCreate9()
- FAILED"), 0, 0);
return false;
}
// Step 2: Check for hardware vp.
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,
deviceType, &caps);
int vp
= 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT
)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// Step 3: Fill out the
D3DPRESENT_PARAMETERS structure.
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz
= D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Step 4: Create the device.
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device
type
hwnd, //
window associated with device
vp, //
vertex processing
&d3dpp,
// present parameters
device); // return created device
if( FAILED(hr) )
{
// try again using a 16-bit depth
buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);
if( FAILED(hr) )
{
d3d9->Release(); // done with
d3d9 object
::MessageBox(0, _T("CreateDevice()
- FAILED"), 0, 0);
return false;
}
}
d3d9->Release(); // done with
d3d9 object
return true;
}
int d3d::EnterMsgLoop( bool
(*ptr_display)(float
timeDelta) )
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG));
static float
lastTime = (float)timeGetTime();
while(msg.message != WM_QUIT)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime =
(float)timeGetTime();
float timeDelta = (currTime
- lastTime)*0.001f;
ptr_display(timeDelta);
lastTime = currTime;
}
}
return msg.wParam;
}
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:Fixedsys;
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-format:other;
mso-font-pitch:fixed;
mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
{font-family:"/@Fixedsys";
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-format:other;
mso-font-pitch:fixed;
mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
{font-family:"/@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File:
d3dinit.cpp
//
// Author: Frank
Luna (C) All Rights Reserved
//
// System: AMD
Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc:
Demonstrates how to initialize Direct3D, how to use the book's framework
// functions, and how to clear the screen
to black. Note that the Direct3D
// initialization code is in the
d3dUtility.h/.cpp files.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "d3dUtility.h"
//
// Globals
//
IDirect3DDevice9* Device = 0;
//
// Framework
Functions
//
bool Setup()
{
// Nothing to setup in this sample.
return true;
}
void Cleanup()
{
// Nothing to cleanup in this sample.
}
bool Display(float timeDelta)
{
if( Device
) // Only use Device methods if we have a valid
device.
{
// Instruct the device to set each
pixel on the back buffer black -
// D3DCLEAR_TARGET: 0x00000000
(black) - and to set each pixel on
// the depth buffer to a value of
1.0 - D3DCLEAR_ZBUFFER: 1.0f.
Device->Clear(0, 0, D3DCLEAR_TARGET
| D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
// Swap the back and front buffers.
Device->Present(0, 0, 0, 0);
}
return true;
}
//
// WinMain
//
int WINAPI WinMain(HINSTANCE
hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
if(!d3d::InitD3D(hinstance,
640, 480, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(0, _T("InitD3D() -
FAILED"), 0, 0);
return 0;
}
if(!Setup())
{
::MessageBox(0, _T("Setup() -
FAILED"), 0, 0);
return 0;
}
d3d::EnterMsgLoop(
Display );
Cleanup();
Device->Release();
return 0;
}
//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg
)
{
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if( wParam
== VK_ESCAPE )
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
d3dInit.cpp中。
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File:
d3dUtility.h
//
// Author: Frank
Luna (C) All Rights Reserved
//
// System: AMD
Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides
utility functions for simplifying common tasks.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __d3dUtilityH__
#define __d3dUtilityH__
#include <d3dx9.h>
#include <string>
#include <tchar.h>
using namespace std;
namespace d3d
{
bool InitD3D(
HINSTANCE hInstance,
// [in] Application instance.
int width,
int height, // [in]
Backbuffer dimensions.
bool windowed, // [in]
Windowed (true)or full screen (false).
D3DDEVTYPE deviceType,
// [in] HAL or REF
IDirect3DDevice9** device);// [out]The
created device.
int EnterMsgLoop(
bool (*ptr_display)(float timeDelta));
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
template<class T> void Release(T t)
{
if( t
)
{
t->Release();
t = 0;
}
}
template<class T> void Delete(T t)
{
if( t
)
{
delete t;
t = 0;
}
}
}
#endif // __d3dUtilityH__
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File:
d3dUtility.cpp
//
// Author: Frank
Luna (C) All Rights Reserved
//
// System: AMD
Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides
utility functions for simplifying common tasks.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "d3dUtility.h"
bool d3d::InitD3D(
HINSTANCE hInstance,
int width,
int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device)
{
//
// Create the main application window.
//
WNDCLASS wc;
wc.style = CS_HREDRAW
| CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0,
IDI_APPLICATION);
wc.hCursor = LoadCursor(0,
IDC_ARROW);
wc.hbrBackground
= (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName
= _T("Direct3D9App");
if( !RegisterClass(&wc) )
{
::MessageBox(0, _T("RegisterClass()
- FAILED"), 0, 0);
return false;
}
HWND hwnd
= 0;
hwnd = ::CreateWindow(_T("Direct3D9App"), _T("Direct3D9App"),
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance,
0 /*extra*/);
if( !hwnd
)
{
::MessageBox(0, _T("CreateWindow()
- FAILED"), 0, 0);
return false;
}
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);
//
// Init D3D:
//
HRESULT hr = 0;
// Step 1: Create the IDirect3D9
object.
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
::MessageBox(0, _T("Direct3DCreate9()
- FAILED"), 0, 0);
return false;
}
// Step 2: Check for hardware vp.
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,
deviceType, &caps);
int vp
= 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT
)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// Step 3: Fill out the
D3DPRESENT_PARAMETERS structure.
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz
= D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Step 4: Create the device.
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device
type
hwnd, //
window associated with device
vp, //
vertex processing
&d3dpp,
// present parameters
device); // return created device
if( FAILED(hr) )
{
// try again using a 16-bit depth
buffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hwnd,
vp,
&d3dpp,
device);
if( FAILED(hr) )
{
d3d9->Release(); // done with
d3d9 object
::MessageBox(0, _T("CreateDevice()
- FAILED"), 0, 0);
return false;
}
}
d3d9->Release(); // done with
d3d9 object
return true;
}
int d3d::EnterMsgLoop( bool
(*ptr_display)(float
timeDelta) )
{
MSG msg;
::ZeroMemory(&msg, sizeof(MSG));
static float
lastTime = (float)timeGetTime();
while(msg.message != WM_QUIT)
{
if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else
{
float currTime =
(float)timeGetTime();
float timeDelta = (currTime
- lastTime)*0.001f;
ptr_display(timeDelta);
lastTime = currTime;
}
}
return msg.wParam;
}
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:Fixedsys;
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-format:other;
mso-font-pitch:fixed;
mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
{font-family:"/@Fixedsys";
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-format:other;
mso-font-pitch:fixed;
mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
{font-family:"/@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File:
d3dinit.cpp
//
// Author: Frank
Luna (C) All Rights Reserved
//
// System: AMD
Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc:
Demonstrates how to initialize Direct3D, how to use the book's framework
// functions, and how to clear the screen
to black. Note that the Direct3D
// initialization code is in the
d3dUtility.h/.cpp files.
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "d3dUtility.h"
//
// Globals
//
IDirect3DDevice9* Device = 0;
//
// Framework
Functions
//
bool Setup()
{
// Nothing to setup in this sample.
return true;
}
void Cleanup()
{
// Nothing to cleanup in this sample.
}
bool Display(float timeDelta)
{
if( Device
) // Only use Device methods if we have a valid
device.
{
// Instruct the device to set each
pixel on the back buffer black -
// D3DCLEAR_TARGET: 0x00000000
(black) - and to set each pixel on
// the depth buffer to a value of
1.0 - D3DCLEAR_ZBUFFER: 1.0f.
Device->Clear(0, 0, D3DCLEAR_TARGET
| D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
// Swap the back and front buffers.
Device->Present(0, 0, 0, 0);
}
return true;
}
//
// WinMain
//
int WINAPI WinMain(HINSTANCE
hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
if(!d3d::InitD3D(hinstance,
640, 480, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(0, _T("InitD3D() -
FAILED"), 0, 0);
return 0;
}
if(!Setup())
{
::MessageBox(0, _T("Setup() -
FAILED"), 0, 0);
return 0;
}
d3d::EnterMsgLoop(
Display );
Cleanup();
Device->Release();
return 0;
}
//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch( msg
)
{
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if( wParam
== VK_ESCAPE )
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
相关文章推荐
- Introduction to 3D Game Programming with DirectX 11学习笔记 4.4 演示程序框架
- DirectX&Direct 3D 游戏开发之——构建3D程序基本框架
- 《Directx 9.0 3D 游戏开发编程基础》学习总结2--Init例程编译错误
- 《 DirectX 9.0 3D游戏开发编程基础》书评
- DirectX 3D 基本框架(一)
- DirectX 9.0 3D游戏开发编程基础 [书评](zz)
- 微信小程序开发详解 1 : 初始小程序 2 :开发框架配置和逻辑层
- DirectX 9.0 C++ 教程 第一个程序
- 《DirectX 9.0 3D游戏开发编程基础》必备的数学知识 读书笔记
- VS2010配置DirectX 9.0 3D常见问题
- 使用WTL+OGRE编写3D程序(1) - 基本框架
- DirectX游戏开发之3D程序尾声
- DirectX 3D_基础之效果框架 手法和路径 HLSL的内置对象(纹理对象 采样器对象与采样器状态 顶点着色器对象和像素着色器对象)效果文件中的设备状态
- 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
- DirectX 3D_基础之HLSL(高级着色语言) HLSL着色器程序的编制 HSLS变量 HLSL入口函数 HLSL程序编译 变量常量类型 设置方法 前缀 关键字 类型 语句 类型转换
- DirectX 3D 基本框架(三)
- DirectX 3D的程序中关于无法打开d3dx9.h
- DirectX 3D 基本框架(五)
- DirectX 3D 基本框架(二)
- DirectX程序通用框架