DirectX游戏编程(一):创建一个Direct3D程序

时间:2022-08-13 23:45:04

一、环境

Visual Studio 2012,DirectX SDK (June 2010)

二、准备

1.环境变量(如没有配置请添加)

变量名:DXSDK_DIR

变量值:D:\Software\Program\Microsoft DirectX SDK (June 2010)

这里D:\Software\Program\Microsoft DirectX SDK (June 2010)是我的DirectX安装目录,视情况修改即可

DirectX游戏编程(一):创建一个Direct3D程序

DirectX游戏编程(一):创建一个Direct3D程序

 三、步骤

1.打开VS2012,创建一个空的Win32 Project

DirectX游戏编程(一):创建一个Direct3D程序

这里的项目名称(Name)可以自定义,项目位置(Location)可能不同,不过没关系,可以不用修改

DirectX游戏编程(一):创建一个Direct3D程序

点击OK,然后点击Next,勾选Empty Project

DirectX游戏编程(一):创建一个Direct3D程序

点击Finish,完成项目创建。

2.打开项目属性(Properites),配置项目的DirectX环境

DirectX游戏编程(一):创建一个Direct3D程序

主要需修改的项:Configuration Properites->VC++ Directories,Configuration Properites->Linker->General,Configuration Properites->Linker->Input

DirectX游戏编程(一):创建一个Direct3D程序

VC++ Directories:(注意后面的分号)

Include Directories项中添加$(DXSDK_DIR)\Include;

Library Directories项中添加$(DXSDK_DIR)\Lib\x86;

DirectX游戏编程(一):创建一个Direct3D程序

Linker->Input:添加以下三个lib文件d3d9.lib  d3dx9.lib Winmm.lib,添加时注意用分号隔开,如下:

d3d9.lib;d3dx9.lib;Winmm.lib;

DirectX游戏编程(一):创建一个Direct3D程序

Linker->General:AdditionalLibrary Directories项中添加$(DXSDK_DIR)\Lib\x86 (可以不加分号)

DirectX游戏编程(一):创建一个Direct3D程序

点击确定应用以上更改。

3.打开Source.cpp,复制以下代码:

  1 #include <d3dx9.h>
2 IDirect3DDevice9* Device=0;
3 LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
4 {
5 switch(msg)
6 {
7 case WM_DESTROY:PostQuitMessage(0);break;
8 case WM_KEYDOWN:
9 if(wParam==VK_ESCAPE)DestroyWindow(hwnd);break;
10 }
11 return DefWindowProcW(hwnd,msg,wParam,lParam);
12 }
13 bool Init(HINSTANCE hInstance,int width,int height,bool windowed,D3DDEVTYPE devType,IDirect3DDevice9** device)
14 {
15 WNDCLASSW wc;
16 wc.cbClsExtra=0;
17 wc.cbWndExtra=0;
18 wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
19 wc.hCursor=LoadCursorW(0,IDC_ARROW);
20 wc.hIcon=LoadIconW(0,IDI_APPLICATION);
21 wc.hInstance=hInstance;
22 wc.lpfnWndProc=(WNDPROC)WndProc;
23 wc.lpszClassName=L"Direct3D";
24 wc.lpszMenuName=0;
25 wc.style=CS_HREDRAW|CS_VREDRAW;
26 if(!RegisterClassW(&wc))
27 {
28 MessageBoxW(0,L"Register Failed",0,0);
29 return false;
30 }
31
32 HWND hwnd=0;
33 hwnd=CreateWindowW(L"Direct3D",L"Direct3D",WS_OVERLAPPEDWINDOW,0,0,width,height,0,0,hInstance,0);
34 if(!hwnd)
35 {
36 MessageBoxW(0,L"CreateWindow Failed",0,0);
37 return false;
38 }
39 ShowWindow(hwnd,SW_SHOW);
40 UpdateWindow(hwnd);
41
42 HRESULT hr;
43 IDirect3D9* d3d9;
44 d3d9=Direct3DCreate9(D3D_SDK_VERSION);
45
46 int vp=0;
47 D3DCAPS9 caps;
48 d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,devType,&caps);
49 if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
50 vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
51 else vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
52
53 D3DPRESENT_PARAMETERS d3dapp;
54 d3dapp.AutoDepthStencilFormat=D3DFMT_D24S8;
55 d3dapp.BackBufferCount=1;
56 d3dapp.BackBufferFormat=D3DFMT_A8R8G8B8;
57 d3dapp.BackBufferHeight=height;
58 d3dapp.BackBufferWidth=width;
59 d3dapp.EnableAutoDepthStencil=true;
60 d3dapp.Flags=0;
61 d3dapp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
62 d3dapp.hDeviceWindow=hwnd;
63 d3dapp.MultiSampleQuality=0;
64 d3dapp.MultiSampleType=D3DMULTISAMPLE_NONE;
65 d3dapp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
66 d3dapp.SwapEffect=D3DSWAPEFFECT_DISCARD;
67 d3dapp.Windowed=windowed;
68 hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,devType,hwnd,vp,&d3dapp,device);
69 if(FAILED(hr))
70 {
71 MessageBoxW(0,L"CreateDevice Failed",0,0);
72 d3d9->Release();
73 return false;
74 }
75 d3d9->Release();
76 return true;
77 }
78 int EnterMsgLoop(bool (*ptr_display)(float TimeDelta))
79 {
80 MSG msg;
81 ZeroMemory(&msg,sizeof(MSG));
82 float LastTime=(float)GetCurrentTime();
83 while(msg.message!=WM_QUIT)
84 {
85 if(PeekMessageW(&msg,0,0,0,PM_REMOVE))
86 {
87 TranslateMessage(&msg);
88 DispatchMessageW(&msg);
89 }
90 else
91 {
92 float CurTime=(float)GetCurrentTime();
93 float TimeDelta=(float)(CurTime-LastTime)*0.001f;
94 ptr_display(TimeDelta);
95 LastTime=CurTime;
96 }
97 }
98 return msg.wParam;
99 }
100 bool Setup()
101 {
102 return true;
103 }
104 void Cleanup()
105 {
106
107 }
108 bool Display(float TimeDelta)
109 {
110 if(Device)
111 {
112 Device->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0x00000000,1.0f,0);
113 Device->Present(0,0,0,0);
114 }
115 return true;
116 }
117 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE prevInstance,PSTR cmdLine,int showCmd)
118 {
119 if(!Init(hInstance,640,480,true,D3DDEVTYPE_HAL,&Device))
120 MessageBoxW(0,L"Init Failed",0,0);
121 if(!Setup())MessageBoxW(0,L"Setup Failed",0,0);
122 EnterMsgLoop(Display);
123 Cleanup();
124 Device->Release();
125 return 0;
126 }

 

点击Local Windows Debugger编译项目,运行结果如下:

DirectX游戏编程(一):创建一个Direct3D程序

至此,第一个Direct3D程序已经完工。

 

CSDN博客地址:http://blog.csdn.net/lfeng1420