现在的位置: 首页 > 综合 > 正文

在D3D环境下进行2D图形绘制。

2012年08月18日 ⁄ 综合 ⁄ 共 13443字 ⁄ 字号 评论关闭

在D3D环境下进行2D图形绘制。

D3DImage类:这个类是是用来载入图片,绘制图片。

  1. //-----------------------------------------------------------------------------   
  2. // 文件: D3DImage.h   
  3. // 描述: D3DImage类的头文件,定义变量,函数。   
  4. //-----------------------------------------------------------------------------   
  5. #pragma once   
  6. #include <d3dx9.h>   
  7. #pragma comment (lib, "d3d9.lib")   
  8. #pragma comment (lib, "d3dx9.lib")   
  9. class D3DImage   
  10. {   
  11. public:   
  12.     D3DImage(void);   
  13.     D3DImage(LPDIRECT3DDEVICE9 _pd3dDevice);   
  14. public:   
  15.     ~D3DImage(void);   
  16. public:   
  17.     HRESULT setVertex();   
  18.     VOID drawImage(INT _mode, FLOAT _parameter, FLOAT _parameter2=0);   
  19.     VOID setPosition(FLOAT _x, FLOAT _y);   
  20.     VOID setCenter(FLOAT _x, FLOAT _y);   
  21.     VOID setZoom(FLOAT _zoomX, FLOAT _zoomY);   
  22.     VOID setRotation(FLOAT _rotation);   
  23.     VOID move(FLOAT _x, FLOAT _y);   
  24.     VOID loadImage(LPCTSTR  _pSrcFile);       
  25. private:   
  26.     VOID drawImageIndex(INT _index);   
  27.     VOID drawImageAnime(INT _delay);   
  28.     VOID drawImageRotation( FLOAT _rotation, INT _index);   
  29. private:   
  30.     LPDIRECT3DDEVICE9       m_pd3dDevice;           // D3D设备,用于渲染   
  31.     LPDIRECT3DVERTEXBUFFER9 m_pVB;                  // 顶点缓冲   
  32.     LPDIRECT3DTEXTURE9 *    m_pTexture;             // 纹理指针数组   
  33.     FLOAT                   m_fX, m_fY;             // 图片坐标   
  34.     FLOAT                   m_fWidth;               // 图片宽度   
  35.     FLOAT                   m_fHeight;              // 图片高度   
  36.     FLOAT                   m_fZoomX;               // 图片X轴方向缩放比率   
  37.     FLOAT                   m_fZoomY;               // 图片Y轴方向缩放比率   
  38.     FLOAT *                 m_fRotation;            // 图片旋转角度   
  39.     INT                     m_iMaxIndex;            // 最大帧数   
  40.     INT                     m_iCurrentIndex;        // 当前帧数   
  41.     INT                     m_iDelay;               // 延迟变量   
  42.     FLOAT *                 m_fRotationTemp;        // 图片旋转角度临时指针   
  43.     LPDIRECT3DTEXTURE9 *    m_pTextureTemp;         // 纹理指针数组临时指针   
  44.     //自定义定点结构体   
  45.     struct CUSTOMVERTEX   
  46.     {   
  47.         FLOAT x, y, z;          // 3D坐标   
  48.         DWORD color;            // 顶点颜色   
  49.         FLOAT u, v;             // 顶点纹理   
  50.     };   
  51.     // 自定义FVF   
  52. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)   
  53. };   

  1. //-----------------------------------------------------------------------------   
  2. // 文件: D3DImage.cpp   
  3. // 描述: 实现2D图片的绘制。可以缩放,移动,旋转图片。可实现基本动画。   
  4. //-----------------------------------------------------------------------------   
  5. #include "D3DImage.h"   
  6. D3DImage::D3DImage(void)   
  7. {   
  8. }   
  9. //-----------------------------------------------------------------------------   
  10. // 名称: D3DImage()   
  11. // 描述: 自定义构造函数   
  12. //-----------------------------------------------------------------------------   
  13. D3DImage::D3DImage(LPDIRECT3DDEVICE9 _pd3dDevice)   
  14. {   
  15.     // 变量赋值、初始化   
  16.     m_pd3dDevice = _pd3dDevice;   
  17.     m_iMaxIndex = 0;   
  18.     m_iCurrentIndex = 0;   
  19.     m_iDelay = 0;   
  20.     m_fRotation = new FLOAT[m_iMaxIndex+1];   
  21.     m_pTexture = new LPDIRECT3DTEXTURE9[m_iMaxIndex+1];   
  22.     ZeroMemory(m_fRotation,(m_iMaxIndex+1)*sizeof(FLOAT));   
  23.     // 设置顶点   
  24.     setVertex();   
  25. }   
  26. D3DImage::~D3DImage(void)   
  27. {   
  28. }   
  29. //-----------------------------------------------------------------------------   
  30. // 名称: loadImgae()   
  31. // 描述: 载入图片   
  32. //-----------------------------------------------------------------------------   
  33. VOID D3DImage::loadImage(LPCTSTR  _pSrcFile)   
  34. {   
  35.     // 自动扩展纹理数组   
  36.     m_pTextureTemp = new LPDIRECT3DTEXTURE9[m_iMaxIndex+2];   
  37.     m_fRotationTemp = new FLOAT[m_iMaxIndex+2];   
  38.     ZeroMemory(m_fRotationTemp,(m_iMaxIndex+2)*sizeof(FLOAT));   
  39.     memcpy(m_pTextureTemp,m_pTexture, (m_iMaxIndex+1)*sizeof(LPDIRECT3DTEXTURE9));   
  40.     memcpy(m_fRotationTemp,m_fRotation, (m_iMaxIndex+1)*sizeof(FLOAT));   
  41.        
  42.     delete m_pTexture;   
  43.     delete m_fRotation;   
  44.     m_pTexture = m_pTextureTemp;       
  45.     m_fRotation = m_fRotationTemp;   
  46.     // 获得图片基本信息   
  47.     D3DXIMAGE_INFO imageInfo;   
  48.     D3DXGetImageInfoFromFile(_pSrcFile, &imageInfo);   
  49.     // 载入图片   
  50.     D3DXCreateTextureFromFileEx(       
  51.         m_pd3dDevice,    
  52.         _pSrcFile,   
  53.         imageInfo.Width,    
  54.         imageInfo.Height,    
  55.         imageInfo.MipLevels,    
  56.         D3DUSAGE_RENDERTARGET,    
  57.         D3DFMT_A8R8G8B8,    
  58.         D3DPOOL_DEFAULT,   
  59.         D3DX_FILTER_NONE,   
  60.         D3DX_DEFAULT,   
  61.         0,    
  62.         NULL,   
  63.         NULL,   
  64.         &m_pTexture[m_iMaxIndex]);   
  65.     // 设置图片信息   
  66.     m_fWidth = imageInfo.Width;   
  67.     m_fHeight = imageInfo.Height;   
  68.     m_fX = m_fWidth/2;                      // 默认X坐标为宽度的一半   
  69.     m_fY = m_fHeight/2;                     // 默认Y坐标为高度的一半   
  70.     m_fZoomX = 1.0f;                        // 默认X1倍缩放   
  71.     m_fZoomY = 1.0f;                        // 默认Y1倍缩放   
  72.     // 索引上限加一   
  73.     m_iMaxIndex++;   
  74. }   
  75. //-----------------------------------------------------------------------------   
  76. // 名称: setPosition()   
  77. // 描述: 设置图片位置   
  78. //-----------------------------------------------------------------------------   
  79. VOID D3DImage::setPosition(FLOAT _x, FLOAT _y)   
  80. {   
  81.     m_fX = _x+m_fWidth/2*m_fZoomX;   
  82.     m_fY = _y+m_fHeight/2*m_fZoomY;   
  83.     setVertex();   
  84. }   
  85. //-----------------------------------------------------------------------------   
  86. // 名称: setCenter()   
  87. // 描述: 设置图片位置   
  88. //-----------------------------------------------------------------------------   
  89. VOID D3DImage::setCenter(FLOAT _x, FLOAT _y)   
  90. {   
  91.     m_fX = _x;   
  92.     m_fY = _y;   
  93.     setVertex();   
  94. }   
  95. //-----------------------------------------------------------------------------   
  96. // 名称: move()   
  97. // 描述: 移动图片位置   
  98. //-----------------------------------------------------------------------------   
  99. VOID D3DImage::move(FLOAT _x, FLOAT _y)   
  100. {   
  101.     m_fX += _x;   
  102.     m_fY += _y;   
  103.     setVertex();   
  104. }   
  105. //-----------------------------------------------------------------------------   
  106. // 名称: setZoom()   
  107. // 描述: 设置图片缩放   
  108. //-----------------------------------------------------------------------------   
  109. VOID D3DImage::setZoom(FLOAT _zoomX,FLOAT _zoomY)   
  110. {   
  111.     m_fZoomX = _zoomX;   
  112.     m_fZoomY = _zoomY;   
  113.     setVertex();   
  114. }   
  115. //-----------------------------------------------------------------------------   
  116. // 名称: setRotation()   
  117. // 描述: 设置图片旋转   
  118. //-----------------------------------------------------------------------------   
  119. VOID D3DImage::setRotation(FLOAT _rotation)   
  120. {   
  121.     _rotation = _rotation * D3DX_PI /180;   
  122.     D3DXMATRIX matRotate;   
  123.     D3DXMatrixIdentity(&matRotate);   
  124.     FLOAT _fCosR = cosf(_rotation);   
  125.     FLOAT _fSinR = sinf(_rotation);   
  126.     FLOAT _fCenterX = 0.5f;   
  127.     FLOAT _fCenterY = 0.5f;   
  128.     matRotate._11 = _fCosR;   
  129.     matRotate._12 = _fSinR;   
  130.     matRotate._21 = -_fSinR;   
  131.     matRotate._22 = _fCosR;   
  132.     matRotate._31 = _fCenterX + (-_fCenterY * _fCosR)-(-_fCenterX * _fSinR);   
  133.     matRotate._32 = _fCenterY + (-_fCenterY * _fSinR)+(-_fCenterX * _fCosR);   
  134.     m_pd3dDevice->SetTransform(D3DTS_TEXTURE0, &matRotate);   
  135. }   
  136. //-----------------------------------------------------------------------------   
  137. // 名称: setVertex()   
  138. // 描述: 设置图片位置   
  139. //-----------------------------------------------------------------------------   
  140. HRESULT D3DImage::setVertex()   
  141. {   
  142.     // 自定义顶点缓冲数组   
  143.     CUSTOMVERTEX Vertices[] =   
  144.     {   
  145.         //{m_fX-m_fWidth/2*m_fZoomX, m_fY-m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, (0       -0.5f)/m_fWidth, (0        -0.5f)/m_fHeight},        //0   
  146.         //{m_fX+m_fWidth/2*m_fZoomX, m_fY-m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, (m_fWidth-0.5f)/m_fWidth, (0        -0.5f)/m_fHeight},        //1   
  147.         //{m_fX+m_fWidth/2*m_fZoomX, m_fY+m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, (m_fWidth-0.5f)/m_fWidth, (m_fHeight-0.5f)/m_fHeight},        //2   
  148.         //{m_fX-m_fWidth/2*m_fZoomX, m_fY-m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, (0       -0.5f)/m_fWidth, (0        -0.5f)/m_fHeight},        //0   
  149.         //{m_fX+m_fWidth/2*m_fZoomX, m_fY+m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, (m_fWidth-0.5f)/m_fWidth, (m_fHeight-0.5f)/m_fHeight},        //2   
  150.         //{m_fX-m_fWidth/2*m_fZoomX, m_fY+m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, (0       -0.5f)/m_fWidth, (m_fHeight-0.5f)/m_fHeight},        //3   
  151.         {m_fX-m_fWidth/2*m_fZoomX, m_fY-m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, 0.0f, 0.0f},        //0   
  152.         {m_fX+m_fWidth/2*m_fZoomX, m_fY-m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, 1.0f, 0.0f},        //1   
  153.         {m_fX+m_fWidth/2*m_fZoomX, m_fY+m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, 1.0f, 1.0f},        //2   
  154.         {m_fX-m_fWidth/2*m_fZoomX, m_fY-m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, 0.0f, 0.0f},        //0   
  155.         {m_fX+m_fWidth/2*m_fZoomX, m_fY+m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, 1.0f, 1.0f},        //2   
  156.         {m_fX-m_fWidth/2*m_fZoomX, m_fY+m_fHeight/2*m_fZoomY, 0.0f, 0xffffffff, 0.0f, 1.0f},        //3   
  157.     };   
  158.     // 创建定点缓冲   
  159.     if( FAILED( m_pd3dDevice->CreateVertexBuffer( sizeof( Vertices ),   
  160.         0, D3DFVF_CUSTOMVERTEX,   
  161.         D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )   
  162.     {   
  163.         return E_FAIL;   
  164.     }   
  165.     // 填充定点缓冲   
  166.     VOID* pVertices;   
  167.     if( FAILED( m_pVB->Lock( 0, sizeof( Vertices ), ( void** )&pVertices, 0 ) ) )   
  168.         return E_FAIL;   
  169.     memcpy( pVertices, Vertices, sizeof( Vertices ) );   
  170.     m_pVB->Unlock();   
  171.     return S_OK;   
  172. }   
  173. //-----------------------------------------------------------------------------   
  174. // 名称: drawImage()   
  175. // 描述: 绘制图片   
  176. //-----------------------------------------------------------------------------   
  177. VOID D3DImage::drawImage(INT _mode, FLOAT _parameter, FLOAT _parameter2)   
  178. {   
  179.     switch(_mode)   
  180.     {       
  181.     case 0:   
  182.         drawImageIndex(_parameter);   
  183.         break;   
  184.     case 1:   
  185.         drawImageAnime(_parameter);   
  186.         break;   
  187.     case 2:   
  188.         drawImageRotation(_parameter, _parameter2);   
  189.         break;   
  190.     }   
  191. }   
  192. //-----------------------------------------------------------------------------   
  193. // 名称: drawImageIndex()   
  194. // 描述: 绘制单一帧图片   
  195. //-----------------------------------------------------------------------------   
  196. VOID D3DImage::drawImageIndex(INT _index)   
  197. {   
  198.     if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )   
  199.     {   
  200.         // 绘制   
  201.         m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) );   
  202.         m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );   
  203.         // 设置贴图   
  204.         m_pd3dDevice->SetTexture(0,m_pTexture[_index]);   
  205.         // 绘制矩形   
  206.         m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2);   
  207.         // 结束   
  208.         m_pd3dDevice->EndScene();   
  209.     }   
  210. }   
  211. //-----------------------------------------------------------------------------   
  212. // 名称: drawImageAnime()   
  213. // 描述: 绘制切帧动画   
  214. //-----------------------------------------------------------------------------   
  215. VOID D3DImage::drawImageAnime(INT _delay)   
  216. {       
  217.     if (m_iDelay < _delay)   
  218.         m_iDelay++;   
  219.     else    
  220.     {   
  221.         if (m_iCurrentIndex < m_iMaxIndex-1)   
  222.         {   
  223.             m_iCurrentIndex++;   
  224.         }   
  225.         else  
  226.         {   
  227.             m_iCurrentIndex = 0;   
  228.         }   
  229.         m_iDelay = 0;   
  230.     }   
  231.     if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )   
  232.     {   
  233.         // 绘制   
  234.         m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) );   
  235.         m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );   
  236.         // 设置贴图   
  237.         m_pd3dDevice->SetTexture(0,m_pTexture[m_iCurrentIndex]);   
  238.         // 绘制矩形   
  239.         m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2);   
  240.         // 结束   
  241.         m_pd3dDevice->EndScene();   
  242.     }   
  243. }   
  244. //-----------------------------------------------------------------------------   
  245. // 名称: drawImageRotation()   
  246. // 描述: 绘制旋转动画    
  247. //-----------------------------------------------------------------------------   
  248. VOID D3DImage::drawImageRotation(FLOAT _rotation, INT _index)   
  249. {   
  250.     if (m_fRotation[_index] < 360)   
  251.     {   
  252.         m_fRotation[_index] += _rotation;   
  253.     }   
  254.     else  
  255.     {   
  256.         m_fRotation[_index] = m_fRotation[_index] - 360;   
  257.     }   
  258.     if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )   
  259.     {   
  260.         // 绘制   
  261.         m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) );   
  262.         m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );   
  263.         // 设置贴图   
  264.         m_pd3dDevice->SetTexture(0,m_pTexture[_index]);   
  265.            
  266.         // 旋转贴图   
  267.         setRotation(m_fRotation[_index]);   
  268.         // 绘制矩形   
  269.         m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2);   
  270.         // 恢复贴图旋转   
  271.         setRotation(0);   
  272.         // 结束   
  273.         m_pd3dDevice->EndScene();   
  274.     }   
  275. }  

抱歉!评论已关闭.