导言:一个黑屏程序,要调用这么多的函数,可见游戏编程的艰辛。
上次我们学了函数InitializeD3D()函数,现在我们的任务就是学习真正的渲染屏幕了。我们不妨用RenderScece()这个函数来承载这个功能。详细的过程我们可以参考《DirectX游戏开发终极指南》这本书。我只是想说说自己对于这个函数的理解。
RenderScene()这个函数的功能大概是这样的:
最后一定不要忘记四方自己所创建的所有对象。书上使用的是Shutdown()函数。这个函数将所有已创建的类都释放出来。我注意到,这些类首先被释放资源,然后将指针设置为NULL,至此,所有的任务就已经完成了。
以下是程序的主干框架。
下面是完整的代码。
- #include<d3d9.h>
- #pragmacomment(lib,"d3d9.lib")//连接库函数的
- #pragmacomment(lib,"d3dx9.lib")//连接库函数的
- #defineWINDOW_CLASS"UGPDX"
- #defineWINDOW_NAME"BlankD3DWindow"
- //FunctionPrototypes...
- boolInitializeD3D(HWNDhWnd,boolfullscreen);
- voidRenderScene();
- voidShutdown();
- //Direct3Dobjectanddevice.
- LPDIRECT3D9g_D3D=NULL;
- LPDIRECT3DDEVICE9g_D3DDevice=NULL;
- LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
- {
- switch(msg)
- {
- caseWM_DESTROY:
- PostQuitMessage(0);
- return0;
- break;
- caseWM_KEYUP:
- if(wParam==VK_ESCAPE)PostQuitMessage(0);
- break;
- }
- returnDefWindowProc(hWnd,msg,wParam,lParam);
- }
- intWINAPIWinMain(HINSTANCEhInst,HINSTANCEprevhInst,LPSTRcmdLine,intshow)
- {
- //Registerthewindowclass
- WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
- GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
- WINDOW_CLASS,NULL};
- RegisterClassEx(&wc);
- //Createtheapplication'swindow
- HWNDhWnd=CreateWindow(WINDOW_CLASS,WINDOW_NAME,WS_OVERLAPPEDWINDOW,
- 100,100,640,480,GetDesktopWindow(),NULL,
- wc.hInstance,NULL);
- //InitializeDirect3D
- if(InitializeD3D(hWnd,false))
- {
- //Showthewindow
- ShowWindow(hWnd,SW_SHOWDEFAULT);
- UpdateWindow(hWnd);
- //Enterthemessageloop
- MSGmsg;
- ZeroMemory(&msg,sizeof(msg));
- while(msg.message!=WM_QUIT)
- {
- if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- RenderScene();
- }
- }
- //Releaseanyandallresources.
- Shutdown();
- //Unregisterourwindow.
- UnregisterClass(WINDOW_CLASS,wc.hInstance);
- return0;
- }
- boolInitializeD3D(HWNDhWnd,boolfullscreen)
- {
- D3DDISPLAYMODEdisplayMode;
- //CreatetheD3Dobject.
- g_D3D=Direct3DCreate9(D3D_SDK_VERSION);
- if(g_D3D==NULL)returnfalse;
- //Getthedesktopdisplaymode.
- if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
- returnfalse;
- //SetupthestructureusedtocreatetheD3DDevice
- D3DPRESENT_PARAMETERSd3dpp;
- ZeroMemory(&d3dpp,sizeof(d3dpp));
- if(fullscreen)
- {
- d3dpp.Windowed=FALSE;
- d3dpp.BackBufferWidth=640;
- d3dpp.BackBufferHeight=480;
- }
- else
- d3dpp.Windowed=TRUE;
- d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat=displayMode.Format;
- //CreatetheD3DDevice
- if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_D3DDevice)))
- {
- returnfalse;
- }
- returntrue;
- }
- voidRenderScene()
- {
- //Clearthebackbuffer.
- g_D3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
- //Beginthescene.Startrendering.
- g_D3DDevice->BeginScene();
- //Endthescene.Stoprendering.
- g_D3DDevice->EndScene();
- //Displaythescene.
- g_D3DDevice->Present(NULL,NULL,NULL,NULL);
- }
- voidShutdown()
- {
- if(g_D3DDevice!=NULL)g_D3DDevice->Release();
- if(g_D3D!=NULL)g_D3D->Release();
- }
要顺利地运行程序,必须使用这些语句:
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
当然,这些也可在VS2005中可以设置,即不用加语句,在VS2005,点“项目->属性”打开对话框,在左边树状图:配置属性->连接器->输入,在右边附加依赖项中写上要连接的库文件就行了。
至此这个“Black Window”程序终于完成了,是不是有些困难呢?以后我相信大家熟悉了后就不会觉得困难了。
本文介绍了一个简单的DirectX游戏窗口渲染程序实现过程。通过分析InitializeD3D()、RenderScene()及Shutdown()等关键函数,展示了如何从零开始构建一个能够渲染黑色窗口的游戏程序。
4685

被折叠的 条评论
为什么被折叠?



