www.pudn.com > D3DITEM01.rar > D3DInitfun.cpp
#include "D3DInitfun.h"
#include "resource.h"
#pragma comment(lib, "Winmm.lib")
#pragma comment(lib, "d3d9.lib")
D3DPRESENT_PARAMETERS g_d3dpp;
bool d3d::InitD3D(HINSTANCE hInstance,int width, int height,bool windowed,D3DDEVTYPE deviceType,IDirect3DDevice9** device)
{
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(hInstance,MAKEINTRESOURCE(IDI_ICON1));
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "D3DGAME";
if( !RegisterClass(&wc))
{
MessageBox(0, "Class register failed!", 0, 0);
return false;
}
HWND hwnd = 0;
hwnd = CreateWindow("D3DGAME", "D3DGAME",WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,0, 0, width, height,0 , 0 , hInstance, 0);
if( !hwnd )
{
MessageBox(0, "Create Window failed!", 0, 0);
return false;
}
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
// 初始D3D:
HRESULT hr = 0;
// Step 1:创建D3D对象
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if( !d3d9 )
{
MessageBox(0, "D3D create failed!", 0, 0);
return false;
}
// Step 2:检测硬件是否能满足能力
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: 设置D3DPRESENT_PARAMETERS结构参数获得一个对象
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: 创建一个设备对象接口
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, //基础设备适配器硬件
deviceType, //设备类型
hwnd,
vp, //处理方式
&d3dpp, //加栽参数
device); //得到一个d3d设备对象接口
if( FAILED(hr) )
{
//(上面的创建方式失败!)尝试以16位深度创建设备
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, //默认始配器
deviceType, //设备类型
hwnd,
vp, //处理方式
&d3dpp,
device); //得到一个d3d设备对象接口
if( FAILED(hr)) //如果失败推出程序
{
d3d9->Release(); //撤消一个对象
MessageBox(0, "Device create failed!", 0, 0);
return false;
}
}
d3d9->Release();
g_d3dpp=d3dpp;
return true;
}
int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) )
{
MSG msg;
ZeroMemory(&msg, sizeof(MSG)); //把对象msg全部初始为0
static float lastTime = (float)timeGetTime(); //获得当前的内核对象时间
while(msg.message != WM_QUIT) //D3D程序主循环
{
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 0;
}