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

时间:2022-03-18 23:44:01

转自 http://blog.csdn.net/lfeng1420/article/details/20639665


一、环境

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,复制以下代码:

[cpp]  view plain copy DirectX游戏编程(一):创建一个Direct3D程序 DirectX游戏编程(一):创建一个Direct3D程序
  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程序已经完工。