• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 創建Direct3D對象和設備例子

    發表于:2007-04-28來源:作者:點擊數: 標簽:游戲測試Direct3D雖然例子對象
    雖然看到我寫的東西的人不多但也有人評價,這是好事啊 這也是我學習的記錄場地?,F在這人寫的書都是只能看不能用,只有自己捉摸了。 //********************************************* //功能:創建Direct3D對象和設備例子 //作者:張小斌 //時間:2005.3.30

    雖然看到我寫的東西的人不多但也有人評價,這是好事啊

    這也是我學習的記錄場地?,F在這人寫的書都是只能看不能用,只有自己捉摸了。

    //*********************************************
    //功能:創建Direct3D對象和設備例子
    //作者:張小斌
    //時間:2005.3.30
    //*********************************************
    //防止鏈接出錯
    #pragma comment(lib,"d3d9.lib")
    #pragma comment(lib,"d3dx9.lib")
    #pragma comment(lib,"dinput8.lib")
    #pragma comment(lib,"dxguid.lib")

    #include<windows.h>//windows程序你不包含著是不可能的
    #include<d3d9.h>//即然是DX9程序那肯定是需要包含著個頭文件的

    //接下來定義一個Windows類的宏名稱
    #define MY_WINCLASS_NAME "Direct3d"
    //養成好習慣先聲明一下
    HRESULT InitMy3D(HWND hWnd);
    void Cleanup();
    LRESULT WINAPI MsgProc(HWND hWnd,UINT msg ,WPARAM wParam,LPARAM lParam);
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow) ;

    //記著程序是Direct3d編程時,我們必須先創建Direct3D對象,在程序結束的時候,也必須最后釋放該對象。
    //為了保存創建的Direct3D對象和設備,那我們就需要以下的兩個全局變量

    //在這碰到點問題編譯的時候到這不能正常編譯,再把下面這兩個在手工的重寫一邊,別偷懶,一個字一個字的敲。
    //LPDIRECT3D9       pD3D = NULL;      //定義Direct3D對象的指針,初始化為空
    //LPDIRECT3DDEVICE9 pDev = NULL; //定義Direct3D設備的指針,初始之為空
    LPDIRECT3D9      pD3D = NULL;
    LPDIRECT3DDEVICE9 pDev = NULL;


    //到這就要開始寫方法了既然是DX9程序那就要初始化D3D的環境
    //---------------------------------------------------------
    //方法名:InitD3D()
    //功 能:初始化D3D環境,函數創建了Direct3D對象和Direct3D設備。
    //注 意:函數返回E_FAIL表示失敗,返回E_OK表示成功
    //    說到這了就需要提到一些額外的知識
    //   在Direct3D中,提供了兩個宏專門用于測試函數是否調用成功。
    //        1. FAILED()----對該函數返回的錯誤進行測試,如果函數返回任何錯誤信息,該測試之為真。
    //   ?。玻樱眨茫茫牛牛模牛模ǎ瓕瘮祱绦惺欠癯晒M行測試,如函數執行成功,值為真.
    //---------------------------------------------------------

    HRESULT InitMy3D(HWND hWnd)
    {
     //創建Direct3D對象,這是使用Direct3D的第一步操作
     if(NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION )))
      return E_FAIL;
     
     //獲取當前Windows桌面的顯示模式,保存到定義的d3ddm結構中
     D3DDISPLAYMODE d3ddm;
     //到這用到了上面“注意”中提到的宏。
     //看好了當寫到pD3D->時輸入了">"這個符號而沒有出現下拉列表那就是前面你寫錯了,趕快去查錯。
     if( FAILED( pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT,&d3ddm)))
      return E_FAIL;

     //定義Presend結構
     D3DPRESENT_PARAMETERS d3dpp;

     //把結構清零,創建設備時,結構成員值為0表示使用缺省值
     ZeroMemory(&d3dpp,sizeof(d3dpp));

     //制定創建的Direct3D是支持窗口的設備
     d3dpp.Windowed = TRUE;

     //指定交換效果為D3DSWAPEFFECT_DISCARD,即把后臺表面顯示到前臺表面以后
     //原來的后臺表面包含的信息自動丟失
     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

     //后臺緩沖區的點格式與當前顯示模式的點格式一致
     d3dpp.BackBufferFormat = d3ddm.Format;

     //D3D對象都創建了那就該創建Direct3D設備了
     //1。使用主顯卡創建設備,參數D3DADAPTER_DEFAULT.(如果你的計算機里插了兩塊顯卡那你就的指定清楚,看來微軟早遇見了PCI_E的出現)
     //2。設備類型為硬件抽象設備,使用硬件加速能,參數D3DDEVTYPE_HAL
     //3。使用前面創建的窗口用于目標表面的顯示,參數hWnd
     //4。指定設備對于頂點的處理能力為軟件處理頂點,這是為了讓所有的顯卡制持,參數
     //  D3DCREATE_SOFTWARE_VERTEXPROCESSING
     
     if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pDev)))
     {
      return E_FAIL;
     }
     return S_OK;
     //把上面的看明白了最后的三行你就知道是干嗎的了
    }

    //-----------------------------------------------------------------------------------------------
    //方法名:Cleanup()
    //功  能:釋放創建過的Direct3D對象和設備
    //注  意:C++可不是JAVA有垃圾回收機制,你得把你申請的資源在用完后還給電腦
    //-----------------------------------------------------------------------------------------------
    void Cleanup()
    {
     //釋放時的順序為先釋放創建的設備后釋放對象
     if(pDev !=NULL)
      pDev->Release();
     //Direct3D對象最先創建,但需要最后釋放
     if(pD3D != NULL)
      pD3D->Release();
     return;
     //如果你不明白為何這樣釋放,去把你的C++在復習一下
    }
    //-------------------------------------------------------------------------------------------------------------------
    //方法名:MsgProc()
    //功  能:Windows的詳細處理函數
    //注  意:消息是游戲程序的另一個重點,它用于處理鍵盤,鼠標,遙桿的響應以及觸發的事件
    //        如:主角揮劍砍怪物會發生劍和怪物的碰撞,就需要把這一消息處理是打怪物沒打上還是打上,打傷了如何計算傷害等等。
    //-------------------------------------------------------------------------------------------------------------------
    LRESULT WINAPI MsgProc(HWND hWnd,UINT msg ,WPARAM wParam,LPARAM lParam)
    {
     switch(msg)
     {
     case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
     case WM_PAINT:
      //清除渲染目標表面,使用的顏色是RGB(255,255,255),即白色
      pDev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255, 255, 255),1.0f,0);
      //把渲染的目標表面顯示到窗口的客戶區域
      pDev->Present(NULL,NULL,NULL,NULL);
       ValidateRect(hWnd,NULL);
       return 0;
     }
     return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    //--------------------------------------------------------------------------------------------------------------------
    //方法名:WinMain()
    //功  能:Windows主函數,程序啟動時,從這里開始
    //注  意:你要是不寫他,你就完了
    //--------------------------------------------------------------------------------------------------------------------
    int APIENTRY WinMain(HINSTANCE hInstance,    //hInstance:表示該應用程序的句柄
          HINSTANCE hPrecInstance,//hPrevInstance:為了保持與16位windows應用程序的兼容性
          LPSTR lpCmdLine,        //lpCmdLine:指向命令行參數字符串的指針
          int nCmdShow)           //nCmdShow:指定應用程序窗口顯示方式的整數

    {
     //定義一個類,指定消息的處理函數為MsgProc
     WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0l,0l,
          GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
          MY_WINCLASS_NAME,NULL};
     //注冊這個窗口類
     RegisterClassEx(&wc);

     //創建應用程序窗口
     HWND hWnd = CreateWindow(MY_WINCLASS_NAME,"3D游戲編程--創建Direct3D對象和設備",
      WS_OVERLAPPEDWINDOW,100,100,400,300,
      GetDesktopWindow(),NULL,wc.hInstance,NULL);
     //調用InitMy3D函數對3D對象和設備初始化,傳入的參數為窗口的句柄hWnd
     if(SUCCEEDED(InitMy3D( hWnd)))
     {
      //顯示窗口
      ShowWindow(hWnd,SW_SHOWDEFAULT);
      UpdateWindow(hWnd);

      //程序主循環,進行窗口消息的分發,消息的處理在MsgProc函數中完成
      MSG msg;
      while(GetMessage(&msg,NULL,0,0))
      {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
      }
     }

     //調用Cleanup函數清除3D對象和設備
     Cleanup();

     //注銷窗口類
     UnregisterClass(MY_WINCLASS_NAME,wc.hInstance);
     return 0;
    }



    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>