用DirectX做2D遊戲的三種方法

1 DirectDraw

這是早期的做法,由於現在的DirectDraw已經併入到DirectGraphic當中,而且微軟也已經在Direct SDk8中把DirectDraw部分的文檔取消了,現在多用D3D來做2D的遊戲

 

2 ID3DXSprite

這個接口可以很好的製作2D動畫,ID3DXSpriteDriectX 9.0裏面的一個簡單模塊,在DriectX 9.0幫助文檔裏面對其功能的描術爲:向用戶提供一套簡單的在屏幕上實現精靈渲染的接口。何爲精靈渲染,說白了就是渲染2D畫面,ID3DXSprite幫助用戶通過簡單的操作就能運用DriectX 9.0製作2D遊戲(渲染2D圖形)。對於繪製2D圖片,其主要步驟就是

(1)     讀取圖片,載入紋理

(2)     如果需要對圖片做旋轉或者縮放的話,設置相應的矩陣

(3)     ID3DXSprite::Draw(….)

具體參考代碼如下:

//初始化精靈對像

D3DXCreateSprite(g_pDevice, &g_pSprite);

g_pDevice->BeginScene();

    g_pDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL,

                 D3DCOLOR_XRGB(0,0,0),1.0f,0L);

g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);

        

//得到2D座標轉換矩陣

   D3DXMatrixTransformation2D(&mat, NULL, 0.0f, &D3DXVECTOR2(0.1f, 0.1f),

                            &D3DXVECTOR2(50.0f, 50.0f), 0.5f, &D3DXVECTOR2(100.0f, 100.0f));

   g_pSprite->SetTransform(&mat);

        

//渲染精靈

    g_pSprite->Draw(g_ptexSprite, NULL, NULL, NULL, 0x99ffffff);

g_pSprite->End();

g_pDevice->EndScene();

g_pDevice->Present(NULL, NULL, NULL, NULL);

 

另:ID3DXSprite::Draw ()方法9.0C以上版本爲5個參數. 9.0B版本爲7個參數。

 

3 設置頂點格式爲D3DFVF_ XYZRHW

   Direct3D提供了一種座標格式 D3DFVF_XYZRHW,用於變換後的座標空間。它有 4 個分量 xyzrhw,其中 xy 使用窗口座標,zrhw 代表深度。只要把 zrhw 設置成常數(通常 z 0rhw1),就可以用它來定義二維圖形的頂點。在使用這種座標格式繪製二維圖形時,建議用頂點顏色或紋理進行渲染,不要使用光照和材質,而且要禁用 Z 緩存,此時後繪製的圖形將覆蓋在最上面。

下面來演示如何顯示一個二維的紅色三角形,使用頂點顏色渲染,圖元格式選三角形列

//紅色三角形的 FVF 格式:RHW 座標、頂點顏色

  struct CUSTOMVERTEX3

  {

   float x,y,z,rhw;  //頂點座標

   DWORD color;  //頂點顏色

  };

  #define D3DFVF_CUSTOMVERTEX3 (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

LPDIRECT3DVERTEXBUFFER9 m_pVB3;//紅色三角形的頂點緩存區接口指針

 

  //建立紅色三角形

  CUSTOMVERTEX3 vertices3[3] =  //頂點爲紅色

      {{ 10, 30, 0.0f, 1.0f, D3DCOLOR_XRGB(255,0,0) },  

      { 110, 30, 0.0f, 1.0f, D3DCOLOR_XRGB(255,0,0) },

      { 10, 130, 0.0f, 1.0f, D3DCOLOR_XRGB(255,0,0) }};

 

  //創建紅色三角形的頂點緩存區,填入頂點數據(博文長度有限制,此處代碼略) 

  .....

 

  //渲染紅色三角形

  m_pDevice->SetFVF( D3DFVF_CUSTOMVERTEX3 );

  m_pDevice->SetStreamSource( 0, m_pVB3, 0, sizeof(CUSTOMVERTEX3) );

  m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

  .....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章