我的第一个DirectX程序

来源:互联网 发布:数据分析师需要的技能 编辑:程序博客网 时间:2024/04/27 19:53

之前本来就有这样的打算的,学了一点HGE引擎之后,再回过头来看DX的SDK,会容易一些。

就像我之前,做过一个MFC的课程设计之后,现在回过头来学孙鑫的第一集WIN32SDK会更容易理解。

这样做的好处就是:在你看不懂的时候仍然能做出东西来,让你不灰心,有兴趣学下去。

如果我开始就看DX的话难度肯定比现在大。而我现在虽然不懂DX,但是也有过开发几个小游戏项目的经验了,而且HGE本身就是基于DX8的这么一个引擎,很大程度上还是保留了一些DX的习惯,所以我现在觉得简单多了。

其实不止是C++,PHP我也是现在直接用ThinkPHP,ASP我用的是EasyAsp,弄来弄去都是框架之类的东西,KISS原则。

好了,闲话不多说,上程序。

这个程序能实现的功能是——————————好吧,不是hello world,而只是一个黑屏。将屏幕以DX的方式渲染成黑色。

Code:
  1. #include <windows.h>   
  2. #include <d3d9.h>   
  3.   
  4. #pragma comment (lib, "d3d9.lib")   
  5. #pragma comment (lib, "d3dx9.lib")   
  6.   
  7. #define WS_MYWINDOW (WS_OVERLAPPEDWINDOW    &/   
  8.                      ~WS_MAXIMIZEBOX        &/   
  9.                      ~WS_THICKFRAME)   
  10.   
  11. /** DirectX对象和装置 */  
  12. LPDIRECT3D9 g_D3D = NULL;   
  13. LPDIRECT3DDEVICE9 g_D3DDevice = NULL;   
  14.   
  15. /**  
  16.  * @brief 关闭函数  
  17.  * 退出程序时释放D3D相关资源  
  18.  */  
  19. void Shutdown()   
  20. {   
  21.     if(NULL != g_D3DDevice) g_D3DDevice->Release();   
  22.     if(NULL != g_D3D) g_D3D->Release();   
  23.   
  24.     g_D3DDevice = NULL;   
  25.     g_D3D = NULL;   
  26. }   
  27.   
  28. /**  
  29.  * @brief 渲染函数  
  30.  * 将屏幕渲染成黑色  
  31.  */  
  32. void RenderScene()   
  33. {   
  34.     /** 以黑色清屏 */  
  35.     g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,   
  36.         D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);   
  37.   
  38.     /** 开始渲染 */  
  39.     g_D3DDevice->BeginScene();   
  40.   
  41.     /** 结束 */  
  42.     g_D3DDevice->EndScene();   
  43.   
  44.     /** 显示到屏幕上 */  
  45.     g_D3DDevice->Present(NULL, NULL, NULL, NULL);   
  46. }   
  47.   
  48. /** 初始化D3D */  
  49. bool InitializeD3D(HWND hWnd, bool fullscreen)   
  50. {   
  51.     D3DDISPLAYMODE displayMode;   
  52.   
  53.     /** 创建D3D对象 */  
  54.     g_D3D = Direct3DCreate9(D3D_SDK_VERSION);   
  55.     if(!g_D3D) return false;   
  56.   
  57.     /** 显示模式 */  
  58.     if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))   
  59.         return false;   
  60.   
  61.     D3DPRESENT_PARAMETERS d3dpp;   
  62.     ZeroMemory(&d3dpp, sizeof(d3dpp));   
  63.   
  64.     if(fullscreen)   
  65.     {   
  66.         d3dpp.Windowed = false;   
  67.         d3dpp.BackBufferWidth = 800;   
  68.         d3dpp.BackBufferHeight = 600;   
  69.     }   
  70.     else  
  71.     {   
  72.         d3dpp.Windowed = true;   
  73.     }   
  74.   
  75.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   
  76.     d3dpp.BackBufferFormat = displayMode.Format;   
  77.   
  78.     /** 创建装置 */  
  79.     if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,   
  80.         D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,   
  81.         &d3dpp, &g_D3DDevice))) return false;   
  82.   
  83.     return true;   
  84. }   
  85.   
  86. LRESULT WINAPI WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)   
  87. {   
  88.     switch(Msg)   
  89.     {   
  90.     case WM_DESTROY:   
  91.         PostQuitMessage(0);   
  92.         return 0;   
  93.         break;   
  94.   
  95.     case WM_KEYUP:   
  96.         if(VK_ESCAPE == wParam) PostQuitMessage(0);   
  97.         break;   
  98.     }   
  99.   
  100.     return DefWindowProc(hWnd, Msg, wParam, lParam);   
  101. }   
  102.   
  103. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTRint)   
  104. {   
  105.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0, 0, hInstance,   
  106.         NULL, NULL, NULL, NULL, "App", NULL};   
  107.   
  108.     RegisterClassEx(&wc);   
  109.   
  110.     HWND hWnd;   
  111.     hWnd = CreateWindow("App""DirectX 1.4", WS_MYWINDOW,   
  112.         CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL,   
  113.         hInstance, NULL);   
  114.   
  115.     if(InitializeD3D(hWnd, false))   
  116.     {   
  117.         ShowWindow(hWnd, SW_SHOWDEFAULT);   
  118.         UpdateWindow(hWnd);   
  119.   
  120.         MSG Msg;   
  121.         ZeroMemory(&Msg, sizeof(Msg));   
  122.   
  123.         while(Msg.message != WM_QUIT)   
  124.         {   
  125.             if(PeekMessage(&Msg, NULL, 0U, 0U, PM_REMOVE))   
  126.             {   
  127.                 TranslateMessage(&Msg);   
  128.                 DispatchMessage(&Msg);   
  129.             }   
  130.             else  
  131.             {   
  132.                 RenderScene();   
  133.             }   
  134.         }   
  135.   
  136.         Shutdown();   
  137.     }   
  138.   
  139.     UnregisterClass("App", wc.hInstance);   
  140.   
  141.     return 0;   
  142. }