解析最簡單的DirectX程式“Blank Window”(三)

來源:互聯網
上載者:User

導言:一個黑屏程式,要調用這麼多的函數,可見遊戲編程的艱辛。
上次我們學了函數InitializeD3D()函數,現在我們的任務就是學習真正的渲染螢幕了。我們不妨用RenderScece()這個函數來承載這個功能。詳細的過程我們可以參考《DirectX遊戲開發終極指南》這本書。我只是想說說自己對於這個函數的理解。
RenderScene()這個函數的功能大概是這樣的:

最後一定不要忘記四方自己所建立的所有對象。書上使用的是Shutdown()函數。這個函數將所有已建立的類都釋放出來。我注意到,這些類首先被釋放資源,然後將指標設定為NULL,至此,所有的任務就已經完成了。

以下是程式的主幹架構。

下面是完整的代碼。

Code:
  1. #include<d3d9.h>   
  2.   
  3. #pragma comment(lib, "d3d9.lib")//串連庫函數的   
  4. #pragma comment(lib, "d3dx9.lib")//串連庫函數的   
  5.   
  6. #define WINDOW_CLASS "UGPDX"   
  7. #define WINDOW_NAME  "Blank D3D Window"   
  8.   
  9.   
  10. // Function Prototypes...   
  11. bool InitializeD3D(HWND hWnd, bool fullscreen);   
  12. void RenderScene();   
  13. void Shutdown();   
  14.   
  15.   
  16. // Direct3D object and device.   
  17. LPDIRECT3D9 g_D3D = NULL;   
  18. LPDIRECT3DDEVICE9 g_D3DDevice = NULL;   
  19.   
  20.   
  21. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)   
  22. {   
  23.    switch(msg)   
  24.       {   
  25.          case WM_DESTROY:   
  26.             PostQuitMessage(0);   
  27.             return 0;   
  28.             break;   
  29.   
  30.          case WM_KEYUP:   
  31.             if(wParam == VK_ESCAPE) PostQuitMessage(0);   
  32.             break;   
  33.       }   
  34.   
  35.    return DefWindowProc(hWnd, msg, wParam, lParam);   
  36. }   
  37.   
  38.   
  39. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)   
  40. {   
  41.    // Register the window class   
  42.    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,   
  43.                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,   
  44.                      WINDOW_CLASS, NULL };   
  45.    RegisterClassEx(&wc);   
  46.   
  47.    // Create the application's window   
  48.    HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,   
  49.                             100, 100, 640, 480, GetDesktopWindow(), NULL,   
  50.                             wc.hInstance, NULL);   
  51.   
  52.    // Initialize Direct3D   
  53.    if(InitializeD3D(hWnd, false))   
  54.       {   
  55.          // Show the window   
  56.          ShowWindow(hWnd, SW_SHOWDEFAULT);   
  57.          UpdateWindow(hWnd);   
  58.   
  59.          // Enter the message loop   
  60.          MSG msg;   
  61.          ZeroMemory(&msg, sizeof(msg));   
  62.   
  63.          while(msg.message != WM_QUIT)   
  64.             {   
  65.                if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))   
  66.                   {   
  67.                      TranslateMessage(&msg);   
  68.                      DispatchMessage(&msg);   
  69.                   }   
  70.                else  
  71.                   RenderScene();   
  72.             }   
  73.       }   
  74.   
  75.    // Release any and all resources.   
  76.    Shutdown();   
  77.   
  78.    // Unregister our window.   
  79.    UnregisterClass(WINDOW_CLASS, wc.hInstance);   
  80.    return 0;   
  81. }   
  82.   
  83.   
  84. bool InitializeD3D(HWND hWnd, bool fullscreen)   
  85. {   
  86.    D3DDISPLAYMODE displayMode;   
  87.   
  88.    // Create the D3D object.   
  89.    g_D3D = Direct3DCreate9(D3D_SDK_VERSION);   
  90.    if(g_D3D == NULL) return false;   
  91.   
  92.    // Get the desktop display mode.   
  93.    if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))   
  94.       return false;   
  95.   
  96.    // Set up the structure used to create the D3DDevice   
  97.    D3DPRESENT_PARAMETERS d3dpp;   
  98.    ZeroMemory(&d3dpp, sizeof(d3dpp));   
  99.   
  100.    if(fullscreen)   
  101.       {   
  102.          d3dpp.Windowed = FALSE;   
  103.          d3dpp.BackBufferWidth = 640;   
  104.          d3dpp.BackBufferHeight = 480;   
  105.       }   
  106.    else  
  107.       d3dpp.Windowed = TRUE;   
  108.    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   
  109.    d3dpp.BackBufferFormat = displayMode.Format;   
  110.   
  111.    // Create the D3DDevice   
  112.    if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,   
  113.              D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))   
  114.       {   
  115.          return false;   
  116.       }   
  117.   
  118.    return true;   
  119. }   
  120.   
  121.   
  122. void RenderScene()   
  123. {   
  124.    // Clear the backbuffer.   
  125.    g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);   
  126.   
  127.    // Begin the scene.  Start rendering.   
  128.    g_D3DDevice->BeginScene();   
  129.   
  130.    // End the scene.  Stop rendering.   
  131.    g_D3DDevice->EndScene();   
  132.   
  133.    // Display the scene.   
  134.    g_D3DDevice->Present(NULL, NULL, NULL, NULL);   
  135. }   
  136.   
  137.   
  138. void Shutdown()   
  139. {   
  140.    if(g_D3DDevice != NULL) g_D3DDevice->Release();   
  141.    if(g_D3D != NULL) g_D3D->Release();   
  142. }  

 

要順利地運行程式,必須使用這些語句:

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
當然,這些也可在VS2005中可以設定,即不用加語句,在VS2005,點“項目->屬性”開啟對話方塊,在左邊樹狀圖:配置屬性->連接器->輸入,在右邊附加依賴項中寫上要串連的庫檔案就行了。

至此這個“Black Window”程式終於完成了,是不是有些困難呢?以後我相信大家熟悉了後就不會覺得困難了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.