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


    在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. }  
  • 相关阅读:
    IE兼容只读模式
    关于css实现单行、多行省略标记
    table表格字母无法换行
    IE浏览器兼容background-size
    IE兼容rgba()透明度
    修改输入框placeholder的默认样式
    Swarm+Docker+Portainer(集群,图形化)
    Docker的centos镜像内无法使用systemctl命令的解决办法
    Docker 制作Nginx镜像
    Xtrabackup 全量备份脚本
  • 原文地址:https://www.cnblogs.com/8586/p/1401368.html
Copyright © 2020-2023  润新知