前腐后继 发表于 2006-12-13 10:57:00

[转帖]DirectX9.0的初级教学

<span id="TopicDetail_DataList1__ctl0_lblPostBody">&nbsp;<br/><br/>编程环境VC++6。6 <br/>DirectX&nbsp;9.0&nbsp;SDK&nbsp;&nbsp;没有可以去微软官方网站下载 <br/>进入C++6。0单击“文件”菜单,选“新建”,在“新建”对话框中选Win32&nbsp;Application <br/>输入文件名为Mygame1 <br/>以下选择空项目,完成既可。 <br/>这时新建文件,选择C++&nbsp;SOURCE&nbsp;文件。名为本Mygame1 <br/><br/><br/>#include&nbsp;<d3d9.h> <br/><br/>#pragma&nbsp;comment(lib,"d3d9.lib")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///////////缺少这句编译不能通过 <br/><br/>LPDIRECT3D9&nbsp;g_pD3D&nbsp;=&nbsp;NULL; <br/>LPDIRECT3DDEVICE9&nbsp;g_pD3DDevice&nbsp;=&nbsp;NULL; <br/><br/>HRESULT&nbsp;InitialiseD3D(HWND&nbsp;hWnd) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建D3D对象,并获得D3D接口指针 <br/>&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D&nbsp;=&nbsp;Direct3DCreate9(D3D_SDK_VERSION); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3D&nbsp;==&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//获得当前的显示模式 <br/>&nbsp;&nbsp;&nbsp;&nbsp;D3DDISPLAYMODE&nbsp;d3ddm; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&nbsp;&amp;d3ddm))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;D3DPRESENT_PARAMETERS&nbsp;d3dpp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(&amp;d3dpp,&nbsp;sizeof(d3dpp)); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建窗口模式的D3D <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.Windowed&nbsp;=&nbsp;TRUE; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.SwapEffect&nbsp;=&nbsp;D3DSWAPEFFECT_DISCARD; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.BackBufferFormat&nbsp;=&nbsp;d3ddm.Format; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建D3D的设备对象,并获取接口IDirect3DDevice9的指针 <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,&nbsp;D3DDEVTYPE_HAL,&nbsp;hWnd,&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DCREATE_SOFTWARE_VERTEXPROCESSING,&nbsp;&amp;d3dpp, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;g_pD3DDevice))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;S_OK; <br/>} <br/><br/>void&nbsp;Render() <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3DDevice&nbsp;==&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//用绿色清除后备缓存 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Clear(0,&nbsp;NULL,&nbsp;D3DCLEAR_TARGET,&nbsp;D3DCOLOR_XRGB(0,&nbsp;0,&nbsp;255),&nbsp;1.0f,&nbsp;0); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//开始屏幕操作 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->BeginScene(); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//我们将在中间完成所有的3D渲染 <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//结束屏幕操作 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->EndScene(); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//翻转后备为屏幕,使画面显示在屏幕上 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Present(NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL); <br/>} <br/><br/>void&nbsp;CleanUp() <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3DDevice&nbsp;!=&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Release(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice&nbsp;=&nbsp;NULL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3D&nbsp;!=&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D->Release(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D&nbsp;=&nbsp;NULL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>} <br/><br/>void&nbsp;GameLoop() <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//进入游戏循环 <br/>&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fMessage; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;PeekMessage(&amp;msg,&nbsp;NULL,&nbsp;0U,&nbsp;0U,&nbsp;PM_NOREMOVE); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;while(msg.message&nbsp;!=&nbsp;WM_QUIT) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fMessage&nbsp;=&nbsp;PeekMessage(&amp;msg,&nbsp;NULL,&nbsp;0U,&nbsp;0U,&nbsp;PM_REMOVE); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fMessage) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理消息 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;msg); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&amp;msg); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有消息时,处理渲染图象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Render(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>} <br/><br/>//Windows消息处理机制,用来处理各种WINDOWS消息,包括常用的键盘消息 <br/>LRESULT&nbsp;WINAPI&nbsp;WinProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;msg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;switch(msg) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_DESTROY: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_KEYUP:&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(wParam) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;VK_ESCAPE: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按“ESC”键退出 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestroyWindow(hWnd); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DefWindowProc(hWnd,&nbsp;msg,&nbsp;wParam,&nbsp;lParam); <br/>} <br/><br/>//应用程序入口主函数,相当于C语言的main()函数 <br/>INT&nbsp;WINAPI&nbsp;WinMain(HINSTANCE&nbsp;hInst,&nbsp;HINSTANCE,&nbsp;LPSTR,&nbsp;INT) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//注册窗口类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEX&nbsp;wc&nbsp;=&nbsp;{sizeof(WNDCLASSEX),&nbsp;CS_CLASSDC,&nbsp;WinProc,&nbsp;0L,&nbsp;0L,&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetModuleHandle(NULL),&nbsp;NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"DX9",&nbsp;NULL}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;RegisterClassEx(&amp;wc); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建应用程序窗口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hWnd&nbsp;=&nbsp;CreateWindow("DX9",&nbsp;"mygame1",&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_OVERLAPPEDWINDOW,&nbsp;50,&nbsp;50,&nbsp;500,&nbsp;500, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetDesktopWindow(),&nbsp;NULL,&nbsp;wc.hInstance,&nbsp;NULL); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//Initialize&nbsp;Direct3D <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(InitialiseD3D(hWnd))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示窗口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hWnd,&nbsp;SW_SHOWDEFAULT); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hWnd); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始游戏并循环 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GameLoop(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;CleanUp(); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;UnregisterClass("DX9",&nbsp;wc.hInstance); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>} </span>

前腐后继 发表于 2006-12-13 10:59:00

<span id="TopicDetail_DataList1__ctl0_lblPostBody">以前的教程都是画一个空间三角形,今天我们用D3D9来画多边行。 <br/>//-----------------------------X <br/>多增加的代码在这两个标志的中间部分 <br/>//X----------------------------- <br/>#include&nbsp;<d3d9.h> <br/><br/>#pragma&nbsp;comment(lib,"d3d9.lib")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///////////缺少这句编译不能通过 <br/><br/>LPDIRECT3D9&nbsp;g_pD3D&nbsp;=&nbsp;NULL; <br/>LPDIRECT3DDEVICE9&nbsp;g_pD3DDevice&nbsp;=&nbsp;NULL; <br/>//创建顶点缓存,D3D采用“可变形顶点格式(FVF)”的技术, <br/>//除顶点坐标外,还包括顶点的法线、颜色、纹理坐标等数据 <br/>LPDIRECT3DVERTEXBUFFER9&nbsp;g_pVB;//顶点缓存的接口指针 <br/>//定义FVF的顶点结构 <br/>//------------------------------------------------------X <br/>struct&nbsp;CUSTOMVERTEX <br/>{ <br/>float&nbsp;x,y,z,rhw;//顶点坐标 <br/>DWORD&nbsp;color;//顶点颜色 <br/>}; <br/>//定义FVF,用到坐标和颜色 <br/>#define&nbsp;D3DFVF_CUSTOMVERTEX&nbsp;(D3DFVF_XYZRHW|D3DFVF_DIFFUSE) <br/><br/>////X------------------------------------X <br/>void&nbsp;InitGeometry() <br/>{ <br/>//建立顶点坐标模型 <br/>CUSTOMVERTEX&nbsp;vertices[]= <br/>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp; <br/>{&nbsp;50.0f,&nbsp;&nbsp;250.0f,&nbsp;0.5f,&nbsp;1.0f,&nbsp;D3DCOLOR_XRGB(255,&nbsp;0,&nbsp;0)&nbsp;}, <br/>{&nbsp;150.0f,&nbsp;150.0f,&nbsp;-0.5f,&nbsp;1.0f,D3DCOLOR_XRGB(0,&nbsp;255,&nbsp;0)},&nbsp;&nbsp;&nbsp;&nbsp; <br/>{&nbsp;&nbsp;270.0f,&nbsp;350.5f,&nbsp;150.0f,&nbsp;1.0f,&nbsp;D3DCOLOR_XRGB(0,0,&nbsp;255)&nbsp;}, <br/>{&nbsp;&nbsp;50.0f,&nbsp;100.5f,&nbsp;50.0f,&nbsp;1.0f,&nbsp;D3DCOLOR_XRGB(0,255,&nbsp;255)&nbsp;}, <br/>{&nbsp;150.0f,&nbsp;&nbsp;250.0f,&nbsp;70.5f,&nbsp;1.0f,&nbsp;D3DCOLOR_XRGB(255,&nbsp;255,&nbsp;255)&nbsp;}, <br/>{&nbsp;50.0f,&nbsp;&nbsp;250.0f,&nbsp;0.5f,&nbsp;1.0f,&nbsp;D3DCOLOR_XRGB(255,&nbsp;0,&nbsp;0)&nbsp;} <br/>};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;x,&nbsp;y,&nbsp;z,&nbsp;rhw,&nbsp;color <br/>&nbsp;&nbsp;&nbsp; <br/>//创建顶点缓存 <br/>g_pD3DDevice->CreateVertexBuffer( <br/>sizeof(vertices), <br/>0,D3DFVF_CUSTOMVERTEX, <br/>D3DPOOL_DEFAULT,&amp;g_pVB,NULL); <br/>//把顶点数据输入缓存区 <br/>void*&nbsp;pVertices; <br/>g_pVB->Lock(0,sizeof(vertices),(void**)&amp;pVertices,0); <br/>memcpy(pVertices,vertices,sizeof(vertices)); <br/>g_pVB->Unlock(); <br/><br/><br/><br/><br/>} <br/>//X----------------------------- <br/>HRESULT&nbsp;InitialiseD3D(HWND&nbsp;hWnd) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建D3D对象,并获得D3D接口指针 <br/>&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D&nbsp;=&nbsp;Direct3DCreate9(D3D_SDK_VERSION); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3D&nbsp;==&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;D3DPRESENT_PARAMETERS&nbsp;d3dpp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(&amp;d3dpp,&nbsp;sizeof(d3dpp)); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建窗口模式的D3D <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.Windowed&nbsp;=&nbsp;TRUE; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.SwapEffect&nbsp;=&nbsp;D3DSWAPEFFECT_DISCARD; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.BackBufferFormat&nbsp;=&nbsp;D3DFMT_UNKNOWN;//d3ddm.Format <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建D3D的设备对象,并获取接口IDirect3DDevice9的指针 <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,&nbsp;D3DDEVTYPE_HAL,&nbsp;hWnd,&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DCREATE_SOFTWARE_VERTEXPROCESSING,&nbsp;&amp;d3dpp, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;g_pD3DDevice))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;S_OK; <br/>} <br/><br/>void&nbsp;Render() <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3DDevice&nbsp;==&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>//InitGeometry(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;//用黑色清除后备缓存 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Clear(0,&nbsp;NULL,&nbsp;D3DCLEAR_TARGET,&nbsp;D3DCOLOR_XRGB(0,&nbsp;0,&nbsp;0),&nbsp;1.0f,&nbsp;0); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//开始屏幕操作&nbsp;&nbsp; <br/>g_pD3DDevice->BeginScene();&nbsp; <br/>//我们将在中间完成所有的3D渲染 <br/>///-------------------------------------------------X <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置自定义的FVF <br/>g_pD3DDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//绑定顶点缓存给设备数据源 <br/>g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//绘制图形,参数1为图形格式,参数3为所绘个数 <br/>g_pD3DDevice->DrawPrimitive(D3DPT_LINESTRIP&nbsp;,0,&nbsp;5);//空间画五条线 <br/>&nbsp; <br/>&nbsp;//X--------------------------------------------&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//结束屏幕操作 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->EndScene(); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//翻转后备为屏幕,使画面显示在屏幕上 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Present(NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL); <br/>} <br/><br/>void&nbsp;CleanUp()////释放清除所有设备 <br/>{ <br/>if(g_pVB!=NULL) <br/>{ g_pVB->Release(); <br/>g_pVB=NULL; <br/>} <br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3DDevice&nbsp;!=&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Release(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice&nbsp;=&nbsp;NULL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3D&nbsp;!=&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D->Release(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D&nbsp;=&nbsp;NULL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>} <br/><br/>void&nbsp;GameLoop() <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitGeometry();///载入数据 <br/>&nbsp;&nbsp;&nbsp;&nbsp;//进入游戏循环 <br/>&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fMessage; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;PeekMessage(&amp;msg,&nbsp;NULL,&nbsp;0U,&nbsp;0U,&nbsp;PM_NOREMOVE); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;while(msg.message&nbsp;!=&nbsp;WM_QUIT) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fMessage&nbsp;=&nbsp;PeekMessage(&amp;msg,&nbsp;NULL,&nbsp;0U,&nbsp;0U,&nbsp;PM_REMOVE); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fMessage) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理消息 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;msg); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&amp;msg); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有消息时,处理渲染图象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Render(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>} <br/><br/>//Windows消息处理机制,用来处理各种WINDOWS消息,包括常用的键盘消息 <br/>LRESULT&nbsp;WINAPI&nbsp;WinProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;msg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;switch(msg) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_DESTROY: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_KEYUP:&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(wParam) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;VK_ESCAPE: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按“ESC”键退出 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestroyWindow(hWnd); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DefWindowProc(hWnd,&nbsp;msg,&nbsp;wParam,&nbsp;lParam); <br/>} <br/><br/>//应用程序入口主函数,相当于C语言的main()函数 <br/>INT&nbsp;WINAPI&nbsp;WinMain(HINSTANCE&nbsp;hInst,&nbsp;HINSTANCE,&nbsp;LPSTR,&nbsp;INT) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//注册窗口类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEX&nbsp;wc&nbsp;=&nbsp;{sizeof(WNDCLASSEX),&nbsp;CS_CLASSDC,&nbsp;WinProc,&nbsp;0L,&nbsp;0L,&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetModuleHandle(NULL),&nbsp;NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"DX9",&nbsp;NULL}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;RegisterClassEx(&amp;wc); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建应用程序窗口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hWnd&nbsp;=&nbsp;CreateWindow("DX9",&nbsp;"mygame1",&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_OVERLAPPEDWINDOW,&nbsp;50,&nbsp;50,&nbsp;500,&nbsp;500, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetDesktopWindow(),&nbsp;NULL,&nbsp;wc.hInstance,&nbsp;NULL); <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(InitialiseD3D(hWnd))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示窗口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hWnd,&nbsp;SW_SHOWDEFAULT); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hWnd); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始游戏并循环 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GameLoop(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;CleanUp(); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;UnregisterClass("DX9",&nbsp;wc.hInstance); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>} <br/>如果以上程序运行成功的话,会在窗口内画出5个边的图形! <br/>初学者试着可以修改 <br/>g_pD3DDevice->DrawPrimitive(D3DPT_LINESTRIP&nbsp;,0,&nbsp;5);//空间画五条线 <br/>的参数,使其画出两个三角行表面。 <br/><br/><img id="PicPost" title="您可以使用滑鼠对图片进行放大和缩小!" src="http://gd.91.com/bbs/imgnew/2004/6/25/1088158301762.jpg" border="0" style="CURSOR: hand; ZOOM: 90%;" alt=""/></span>

前腐后继 发表于 2006-12-13 10:59:00

<span id="TopicDetail_DataList1__ctl0_lblPostBody">//该程序模拟彩色下雨特效。初学者如有疑问在下面跟帖。初学者可以自己修改颜色。 <br/><br/>#include&nbsp;<Windows.h> <br/>#include&nbsp;<mmsystem.h> <br/>#include&nbsp;<d3d9.h> <br/>#include&nbsp;<d3dx9.h> <br/>#pragma&nbsp;comment(lib,"d3d9.lib")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;///////////缺少这句编译不能通过 <br/>#pragma&nbsp;comment(lib,"d3dx9dt.lib") <br/>#pragma&nbsp;comment(lib,"winmm.lib") <br/>LPDIRECT3D9&nbsp;g_pD3D&nbsp;=&nbsp;NULL; <br/>LPDIRECT3DDEVICE9&nbsp;g_pD3DDevice&nbsp;=&nbsp;NULL; <br/>//创建顶点缓存,D3D采用“可变形顶点格式(FVF)”的技术, <br/>//除顶点坐标外,还包括顶点的法线、颜色、纹理坐标等数据 <br/>LPDIRECT3DVERTEXBUFFER9&nbsp;g_pVB=NULL;//顶点缓存的接口指针 <br/>//定义FVF的顶点结构 <br/><br/>struct&nbsp;CUSTOMVERTEX <br/>{ <br/>float&nbsp;x,y,z;//顶点坐标 <br/>DWORD&nbsp;color;//顶点颜色 <br/>}my_ex;////定义雨滴数组 <br/>//定义FVF,用到坐标和颜色 <br/>#define&nbsp;D3DFVF_CUSTOMVERTEX&nbsp;(D3DFVF_XYZ|D3DFVF_DIFFUSE) <br/><br/><br/><br/>void&nbsp;SetupMatrices() <br/>{ <br/><br/>D3DXVECTOR3&nbsp;eye(0.0f,0.0f,-42.0f);///观察者视点位置 <br/>D3DXVECTOR3&nbsp;lookat(0.0f,0.0f,0.0f);//观察者视线方向 <br/>D3DXVECTOR3&nbsp;up(0.0f,1.0f,0.0f);//观察者头顶方向,也称上方向 <br/>D3DXMATRIXA16&nbsp;matView; <br/>///设置可视视角矩阵 <br/>D3DXMatrixLookAtLH(&amp;matView,&amp;eye,&amp;lookat,&amp;up); <br/>///把视角矩阵设置到渲染环境 <br/>&nbsp;g_pD3DDevice->SetTransform(D3DTS_VIEW,&amp;matView); <br/><br/><br/>D3DXMATRIXA16&nbsp;matProj; <br/>//设置透视投影矩阵 <br/>D3DXMatrixPerspectiveFovLH(&amp;matProj,//结果矩阵 <br/>D3DX_PI/4,//可视弧度范围 <br/>1.0f,//屏幕高宽比 <br/>1.0f,//最近观测距离 <br/>100.0f);//最远观察距离 <br/><br/>&nbsp;&nbsp;///把透视投影矩阵设置到渲染护环境 <br/>&nbsp;g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&amp;matProj); <br/><br/>} <br/>void&nbsp;InitGeometry() <br/>{ <br/>int&nbsp;i; <br/>for(i=0;i<150;i+=2) <br/>{ <br/>my_ex.y&nbsp;--; <br/>my_ex.y&nbsp;--; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(my_ex.y&nbsp;<-20) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_ex.x=my_ex.x&nbsp;=rand()%40-20; <br/>&nbsp;&nbsp;&nbsp;&nbsp;my_ex.y=10; <br/>&nbsp;&nbsp;&nbsp;&nbsp;my_ex.z&nbsp;=my_ex.z&nbsp;=rand()%40-20; <br/>&nbsp;&nbsp;&nbsp;&nbsp;my_ex.color&nbsp;=D3DCOLOR_XRGB(rand()%255,&nbsp;255,&nbsp;255); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; my_ex.y=13; <br/>&nbsp;&nbsp;&nbsp;&nbsp; my_ex.color&nbsp;=D3DCOLOR_XRGB(255,&nbsp;rand()%255,&nbsp;255); <br/><br/>} <br/>} <br/><br/>//创建顶点缓存 <br/>g_pD3DDevice->CreateVertexBuffer( <br/>sizeof(my_ex),// <br/>0,D3DFVF_CUSTOMVERTEX, <br/>D3DPOOL_DEFAULT,&amp;g_pVB,NULL); <br/>//把顶点数据输入缓存区 <br/>void*&nbsp;pVertices; <br/>g_pVB->Lock(0,sizeof(my_ex),(void**)&amp;pVertices,0); <br/>memcpy(pVertices,my_ex,sizeof(my_ex)); <br/>g_pVB->Unlock(); <br/><br/><br/><br/><br/>} <br/><br/>HRESULT&nbsp;InitialiseD3D(HWND&nbsp;hWnd) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建D3D对象,并获得D3D接口指针 <br/>&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D&nbsp;=&nbsp;Direct3DCreate9(D3D_SDK_VERSION); <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3D&nbsp;==&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;D3DPRESENT_PARAMETERS&nbsp;d3dpp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(&amp;d3dpp,&nbsp;sizeof(d3dpp)); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建窗口模式的D3D <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.Windowed&nbsp;=&nbsp;TRUE; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.SwapEffect&nbsp;=&nbsp;D3DSWAPEFFECT_DISCARD; <br/>&nbsp;&nbsp;&nbsp;&nbsp;d3dpp.BackBufferFormat&nbsp;=&nbsp;D3DFMT_UNKNOWN; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建D3D的设备对象,并获取接口IDirect3DDevice9的指针 <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,&nbsp;D3DDEVTYPE_HAL,&nbsp;hWnd,&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DCREATE_SOFTWARE_VERTEXPROCESSING,&nbsp;&amp;d3dpp, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;g_pD3DDevice))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;E_FAIL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->SetRenderState(&nbsp;D3DRS_CULLMODE,&nbsp;D3DCULL_NONE&nbsp;); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;S_OK; <br/>} <br/><br/>void&nbsp;Render() <br/>{ <br/>&nbsp; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//用黑色清除后备缓存 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Clear(0,&nbsp;NULL,&nbsp;D3DCLEAR_TARGET,&nbsp;D3DCOLOR_XRGB(0,&nbsp;0,&nbsp;0),&nbsp;1.0f,&nbsp;0);// <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//开始屏幕操作&nbsp;&nbsp; <br/>g_pD3DDevice->BeginScene();&nbsp; <br/>//我们将在中间完成所有的3D渲染 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitGeometry(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetupMatrices();///设置相关矩阵 <br/><br/><br/>g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置自定义的FVF <br/>g_pD3DDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//绑定顶点缓存给设备数据源 <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//绘制图形,参数1为图形格式,参数3为所绘个数 <br/>g_pD3DDevice->DrawPrimitive(D3DPT_LINELIST&nbsp;,0,&nbsp;75);//D3DPT_LINESTRIP空间画五条线 <br/>&nbsp; <br/><br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//结束屏幕操作 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->EndScene(); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//翻转后备为屏幕,使画面显示在屏幕上 <br/>&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Present(NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL); <br/>} <br/><br/>void&nbsp;CleanUp()////释放清除所有设备 <br/>{ <br/>if(g_pVB!=NULL) <br/>{ g_pVB->Release(); <br/>g_pVB=NULL; <br/>} <br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3DDevice&nbsp;!=&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice->Release(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice&nbsp;=&nbsp;NULL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(g_pD3D&nbsp;!=&nbsp;NULL) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D->Release(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3D&nbsp;=&nbsp;NULL; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>} <br/><br/>void&nbsp;GameLoop() <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;InitGeometry();///载入数据 <br/>&nbsp;&nbsp;&nbsp;&nbsp;//进入游戏循环 <br/>&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fMessage; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;PeekMessage(&amp;msg,&nbsp;NULL,&nbsp;0U,&nbsp;0U,&nbsp;PM_NOREMOVE); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;while(msg.message&nbsp;!=&nbsp;WM_QUIT) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fMessage&nbsp;=&nbsp;PeekMessage(&amp;msg,&nbsp;NULL,&nbsp;0U,&nbsp;0U,&nbsp;PM_REMOVE); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fMessage) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理消息 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;msg); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&amp;msg); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有消息时,处理渲染图象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Render(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>} <br/><br/>//Windows消息处理机制,用来处理各种WINDOWS消息,包括常用的键盘消息 <br/>LRESULT&nbsp;WINAPI&nbsp;WinProc(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;msg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;switch(msg) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_DESTROY: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_KEYUP:&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(wParam) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;VK_ESCAPE: <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按“ESC”键退出 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DestroyWindow(hWnd); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DefWindowProc(hWnd,&nbsp;msg,&nbsp;wParam,&nbsp;lParam); <br/>} <br/><br/>//应用程序入口主函数,相当于C语言的main()函数 <br/>INT&nbsp;WINAPI&nbsp;WinMain(HINSTANCE&nbsp;hInst,&nbsp;HINSTANCE,&nbsp;LPSTR,&nbsp;INT) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;//注册窗口类 <br/>&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEX&nbsp;wc&nbsp;=&nbsp;{sizeof(WNDCLASSEX),&nbsp;CS_CLASSDC,&nbsp;WinProc,&nbsp;0L,&nbsp;0L,&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetModuleHandle(NULL),&nbsp;NULL,&nbsp;NULL,&nbsp;NULL,&nbsp;NULL, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"DX9",&nbsp;NULL}; <br/>&nbsp;&nbsp;&nbsp;&nbsp;RegisterClassEx(&amp;wc); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//创建应用程序窗口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hWnd&nbsp;=&nbsp;CreateWindow("DX9",&nbsp;"mygame1",&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_OVERLAPPEDWINDOW,&nbsp;50,&nbsp;50,&nbsp;500,&nbsp;500, <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetDesktopWindow(),&nbsp;NULL,&nbsp;wc.hInstance,&nbsp;NULL); <br/><br/>////////////////////////////////雨水坐标初始化 <br/>&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i<150;i++) <br/>{ <br/>my_ex.x=my_ex.x&nbsp;=rand()%40-20; <br/>my_ex.y=rand()%40-20; <br/>my_ex.z&nbsp;=my_ex.z&nbsp;=rand()%40-20; <br/>my_ex.color&nbsp;=D3DCOLOR_XRGB(rand()%255,&nbsp;255,&nbsp;255); <br/>i++; <br/><br/>my_ex.y=my_ex.y-3; <br/><br/>my_ex.color&nbsp;=D3DCOLOR_XRGB(255,&nbsp;rand()%255,&nbsp;255); <br/>} <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(InitialiseD3D(hWnd))) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示窗口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hWnd,&nbsp;SW_SHOWDEFAULT); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hWnd); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始游戏并循环 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GameLoop(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;CleanUp(); <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;UnregisterClass("DX9",&nbsp;wc.hInstance); <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; <br/>}<img id="PicPost" title="您可以使用滑鼠对图片进行放大和缩小!" src="http://gd.91.com/bbs/imgnew/2004/7/4/1088940181467.jpg" border="0" style="CURSOR: hand;" alt=""/></span>

lovemaxmax 发表于 2007-5-5 06:26:00

支持~~
页: [1]
查看完整版本: [转帖]DirectX9.0的初级教学