解析最简单的DirectX程序“Blank Window”(三)

本文介绍了一个简单的DirectX游戏窗口渲染程序实现过程。通过分析InitializeD3D()、RenderScene()及Shutdown()等关键函数,展示了如何从零开始构建一个能够渲染黑色窗口的游戏程序。

导言:一个黑屏程序,要调用这么多的函数,可见游戏编程的艰辛。
上次我们学了函数InitializeD3D()函数,现在我们的任务就是学习真正的渲染屏幕了。我们不妨用RenderScece()这个函数来承载这个功能。详细的过程我们可以参考《DirectX游戏开发终极指南》这本书。我只是想说说自己对于这个函数的理解。
RenderScene()这个函数的功能大概是这样的:

最后一定不要忘记四方自己所创建的所有对象。书上使用的是Shutdown()函数。这个函数将所有已创建的类都释放出来。我注意到,这些类首先被释放资源,然后将指针设置为NULL,至此,所有的任务就已经完成了。

以下是程序的主干框架。


下面是完整的代码。

Code:
  1. #include<d3d9.h>
  2. #pragmacomment(lib,"d3d9.lib")//连接库函数的
  3. #pragmacomment(lib,"d3dx9.lib")//连接库函数的
  4. #defineWINDOW_CLASS"UGPDX"
  5. #defineWINDOW_NAME"BlankD3DWindow"
  6. //FunctionPrototypes...
  7. boolInitializeD3D(HWNDhWnd,boolfullscreen);
  8. voidRenderScene();
  9. voidShutdown();
  10. //Direct3Dobjectanddevice.
  11. LPDIRECT3D9g_D3D=NULL;
  12. LPDIRECT3DDEVICE9g_D3DDevice=NULL;
  13. LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
  14. {
  15. switch(msg)
  16. {
  17. caseWM_DESTROY:
  18. PostQuitMessage(0);
  19. return0;
  20. break;
  21. caseWM_KEYUP:
  22. if(wParam==VK_ESCAPE)PostQuitMessage(0);
  23. break;
  24. }
  25. returnDefWindowProc(hWnd,msg,wParam,lParam);
  26. }
  27. intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmdLine,intshow)
  28. {
  29. //Registerthewindowclass
  30. WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
  31. GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
  32. WINDOW_CLASS,NULL};
  33. RegisterClassEx(&wc);
  34. //Createtheapplication'swindow
  35. HWNDhWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,
  36. 100,100,640,480,GetDesktopWindow(),NULL,
  37. wc.hInstance,NULL);
  38. //InitializeDirect3D
  39. if(InitializeD3D(hWnd,false))
  40. {
  41. //Showthewindow
  42. ShowWindow(hWnd,SW_SHOWDEFAULT);
  43. UpdateWindow(hWnd);
  44. //Enterthemessageloop
  45. MSGmsg;
  46. ZeroMemory(&msg,sizeof(msg));
  47. while(msg.message!=WM_QUIT)
  48. {
  49. if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
  50. {
  51. TranslateMessage(&msg);
  52. DispatchMessage(&msg);
  53. }
  54. else
  55. RenderScene();
  56. }
  57. }
  58. //Releaseanyandallresources.
  59. Shutdown();
  60. //Unregisterourwindow.
  61. UnregisterClass(WINDOW_CLASS,wc.hInstance);
  62. return0;
  63. }
  64. boolInitializeD3D(HWNDhWnd,boolfullscreen)
  65. {
  66. D3DDISPLAYMODEdisplayMode;
  67. //CreatetheD3Dobject.
  68. g_D3D=Direct3DCreate9(D3D_SDK_VERSION);
  69. if(g_D3D==NULL)returnfalse;
  70. //Getthedesktopdisplaymode.
  71. if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
  72. returnfalse;
  73. //SetupthestructureusedtocreatetheD3DDevice
  74. D3DPRESENT_PARAMETERSd3dpp;
  75. ZeroMemory(&d3dpp,sizeof(d3dpp));
  76. if(fullscreen)
  77. {
  78. d3dpp.Windowed=FALSE;
  79. d3dpp.BackBufferWidth=640;
  80. d3dpp.BackBufferHeight=480;
  81. }
  82. else
  83. d3dpp.Windowed=TRUE;
  84. d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
  85. d3dpp.BackBufferFormat=displayMode.Format;
  86. //CreatetheD3DDevice
  87. if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
  88. D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice)))
  89. {
  90. returnfalse;
  91. }
  92. returntrue;
  93. }
  94. voidRenderScene()
  95. {
  96. //Clearthebackbuffer.
  97. g_D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  98. //Beginthescene.Startrendering.
  99. g_D3DDevice->BeginScene();
  100. //Endthescene.Stoprendering.
  101. g_D3DDevice->EndScene();
  102. //Displaythescene.
  103. g_D3DDevice->Present(NULL,NULL,NULL,NULL);
  104. }
  105. voidShutdown()
  106. {
  107. if(g_D3DDevice!=NULL)g_D3DDevice->Release();
  108. if(g_D3D!=NULL)g_D3D->Release();
  109. }

要顺利地运行程序,必须使用这些语句:

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
当然,这些也可在VS2005中可以设置,即不用加语句,在VS2005,点“项目->属性”打开对话框,在左边树状图:配置属性->连接器->输入,在右边附加依赖项中写上要连接的库文件就行了。

至此这个“Black Window”程序终于完成了,是不是有些困难呢?以后我相信大家熟悉了后就不会觉得困难了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值