//----------------------------------------------------------------------------- // 文件: D3DImage.h // // 描述: D3DImage类的头文件,定义变量,函数。 // // 更新: 2009-03-19 by Ninsun //----------------------------------------------------------------------------- #pragma once #include <d3dx9.h> #pragma comment (lib, "d3d9.lib") #pragma comment (lib, "d3dx9.lib") enum DRAWTYPE { DT_INDEX = 0, DT_ANIME = 1, DT_ROTATION = 2, DT_BOARD = 3, }; class D3DImage { public: D3DImage(LPDIRECT3DDEVICE9 _pd3dDevice); public: ~D3DImage(void); public: HRESULT setVertex(); VOID drawImage(INT _mode, FLOAT _parameter); VOID setPosition(FLOAT _x, FLOAT _y, FLOAT _z); VOID setCenter(FLOAT _x, FLOAT _y, FLOAT _z); VOID setSize(FLOAT _width, FLOAT _height); VOID setZoom(FLOAT _zoomX, FLOAT _zoomY); VOID setRotation(FLOAT _rotationZ, FLOAT _rotationX, FLOAT _rotationY); VOID move(FLOAT _x, FLOAT _y, FLOAT _z); VOID loadImage(LPCTSTR _pSrcFile); private: VOID drawImageIndex(INT _index); VOID drawImageAnime(INT _delay); VOID drawImageRotation(FLOAT _rotation); VOID autoExpand(); VOID setTransForm(INT _mode); private: LPDIRECT3DDEVICE9 m_pd3dDevice; // D3D设备,用于渲染 LPDIRECT3DVERTEXBUFFER9 m_pVB; // 顶点缓冲 LPDIRECT3DTEXTURE9 * m_pTexture; // 纹理指针数组 FLOAT m_fX; // 图片坐标 FLOAT m_fY; // 图片坐标 FLOAT m_fZ; // 图片坐标 FLOAT m_fWidth; // 图片宽度 FLOAT m_fHeight; // 图片高度 FLOAT m_fZoomX; // 图片X轴方向缩放比率 FLOAT m_fZoomY; // 图片Y轴方向缩放比率 FLOAT m_fRotationZ; // 图片Z轴旋转角度 FLOAT m_fRotationX; // 图片X轴旋转角度 FLOAT m_fRotationY; // 图片Y轴旋转角度 INT m_iMaxIndex; // 最大帧数 INT m_iCurrentIndex; // 当前帧数 INT m_iDelay; // 延迟变量 LPDIRECT3DTEXTURE9 * m_pTextureTemp; // 纹理指针数组临时指针 D3DXMATRIX m_matTranslate; // 平移变换矩阵 D3DXMATRIX m_matScaling; // 缩放变换矩阵 D3DXMATRIX m_matRotationZ; // Z轴旋转变换矩阵 D3DXMATRIX m_matRotationX; // X轴旋转变换矩阵 D3DXMATRIX m_matRotationY; // Y轴旋转变换矩阵 //自定义定点结构体 struct CUSTOMVERTEX { FLOAT x, y, z; // 3D坐标 DWORD color; // 顶点颜色 FLOAT u, v; // 顶点纹理 }; // 自定义FVF #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1) #define DEF_WIDTH 100.0f #define DEF_HEIGHT 100.0f #define ZOOM (1.0f/100.0f) }; //----------------------------------------------------------------------------- // 文件: D3DImage.cpp // // 描述: 实现2D图片的绘制。可以缩放,移动,旋转图片。可实现基本动画。 // // 更新: 2009-03-19 by Ninsun //----------------------------------------------------------------------------- #include "D3DImage.h" //----------------------------------------------------------------------------- // 名称: D3DImage() // 描述: 自定义构造函数 //----------------------------------------------------------------------------- D3DImage::D3DImage(LPDIRECT3DDEVICE9 _pd3dDevice) { // 变量赋值、初始化 m_pd3dDevice = _pd3dDevice; m_iMaxIndex = 0; m_iCurrentIndex = 0; m_iDelay = 0; m_pTexture = new LPDIRECT3DTEXTURE9[m_iMaxIndex+1]; ZeroMemory(m_pTexture,(m_iMaxIndex+1)*sizeof(LPDIRECT3DTEXTURE9)); m_fWidth = DEF_WIDTH; // 设置图片默认宽度 m_fHeight = DEF_HEIGHT; // 设置图片默认高度 m_fZoomX = 1.0f; // 默认X方向1倍缩放 m_fZoomY = 1.0f; // 默认Y方向1倍缩放 m_fRotationZ = 0; // 默认Z轴旋转角度为0 m_fRotationX = 0; // 默认X轴旋转角度为0 m_fRotationY = 0; // 默认Y轴旋转角度为0 // 设置顶点 setVertex(); } D3DImage::~D3DImage(void) { } //----------------------------------------------------------------------------- // 名称: autoExpand() // 描述: 自动扩展图像数组 //----------------------------------------------------------------------------- VOID D3DImage::autoExpand() { m_pTextureTemp = new LPDIRECT3DTEXTURE9[m_iMaxIndex+2]; ZeroMemory(m_pTextureTemp,(m_iMaxIndex+2)*sizeof(LPDIRECT3DTEXTURE9)); memcpy(m_pTextureTemp,m_pTexture, (m_iMaxIndex+1)*sizeof(LPDIRECT3DTEXTURE9)); delete m_pTexture; m_pTexture = m_pTextureTemp; m_pTextureTemp = NULL; } //----------------------------------------------------------------------------- // 名称: loadImgae() // 描述: 载入图片 //----------------------------------------------------------------------------- VOID D3DImage::loadImage(LPCTSTR _pSrcFile) { // 自动扩展图片数组 autoExpand(); // 获得图片基本信息 D3DXIMAGE_INFO imageInfo; D3DXGetImageInfoFromFile(_pSrcFile, &imageInfo); // 载入图片 D3DXCreateTextureFromFileEx( m_pd3dDevice, _pSrcFile, imageInfo.Width, imageInfo.Height, imageInfo.MipLevels, D3DUSAGE_RENDERTARGET, imageInfo.Format, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT, 0, NULL, NULL, &m_pTexture[m_iMaxIndex]); // 设置图片信息 m_fWidth = (FLOAT)imageInfo.Width; // 获得图片宽度 m_fHeight = (FLOAT)imageInfo.Height; // 获得图片高度 m_fX = 0; // 默认X坐标为0 m_fY = 0; // 默认Y坐标为0 m_fZ = 0; // 默认Z坐标为0 m_fZoomX = 1.0f; // 默认X方向1倍缩放 m_fZoomY = 1.0f; // 默认Y方向1倍缩放 // 初始化变换矩阵 D3DXMatrixTranslation(&m_matTranslate, m_fX, m_fY, 0); D3DXMatrixScaling(&m_matScaling, m_fWidth/DEF_WIDTH*m_fZoomX, m_fHeight/DEF_HEIGHT*m_fZoomY, 1.0f); D3DXMatrixRotationZ(&m_matRotationZ, m_fRotationZ * D3DX_PI/180); D3DXMatrixRotationX(&m_matRotationX, m_fRotationX * D3DX_PI/180); D3DXMatrixRotationY(&m_matRotationY, m_fRotationY * D3DX_PI/180); // 索引上限加一 m_iMaxIndex++; } //----------------------------------------------------------------------------- // 名称: setPosition() // 描述: 设置图片位置 //----------------------------------------------------------------------------- VOID D3DImage::setPosition(FLOAT _x, FLOAT _y, FLOAT _z=0) { m_fX = _x+m_fWidth/2; m_fY = _y+m_fHeight/2; m_fZ = _z; D3DXMatrixTranslation(&m_matTranslate, m_fX, m_fY, m_fZ); } //----------------------------------------------------------------------------- // 名称: setCenter() // 描述: 设置图片位置 //----------------------------------------------------------------------------- VOID D3DImage::setCenter(FLOAT _x, FLOAT _y, FLOAT _z=0) { m_fX = _x; m_fY = _y; m_fZ = _z; D3DXMatrixTranslation(&m_matTranslate, m_fX, m_fY, m_fZ); } //----------------------------------------------------------------------------- // 名称: move() // 描述: 移动图片位置 //----------------------------------------------------------------------------- VOID D3DImage::move(FLOAT _x, FLOAT _y, FLOAT _z) { m_fX = m_fX + _x; m_fY = m_fY + _y; m_fZ = m_fZ + _z; D3DXMatrixTranslation(&m_matTranslate, m_fX, m_fY, m_fZ); } //----------------------------------------------------------------------------- // 名称: setSize() // 描述: 设置图片尺寸 //----------------------------------------------------------------------------- VOID D3DImage::setSize(FLOAT _width, FLOAT _height) { m_fWidth = _width; m_fHeight = _height; D3DXMatrixScaling(&m_matScaling, m_fWidth/DEF_WIDTH*m_fZoomX, m_fHeight/DEF_HEIGHT*m_fZoomY, 1.0f); } //----------------------------------------------------------------------------- // 名称: setZoom() // 描述: 设置图片缩放 //----------------------------------------------------------------------------- VOID D3DImage::setZoom(FLOAT _zoomX,FLOAT _zoomY) { m_fZoomX = _zoomX; m_fZoomY = _zoomY; D3DXMatrixScaling(&m_matScaling, m_fWidth/DEF_WIDTH*m_fZoomX, m_fHeight/DEF_HEIGHT*m_fZoomY, 1.0f); } //----------------------------------------------------------------------------- // 名称: setRotation() // 描述: 设置图片旋转 //----------------------------------------------------------------------------- VOID D3DImage::setRotation(FLOAT _rotationZ, FLOAT _rotationX=0, FLOAT _rotationY=0) { m_fRotationZ = _rotationZ; m_fRotationX = _rotationX; m_fRotationY = _rotationY; _rotationZ = _rotationZ * D3DX_PI /180.0f; _rotationX = _rotationX * D3DX_PI /180.0f; _rotationY = _rotationY * D3DX_PI /180.0f; D3DXMatrixRotationZ(&m_matRotationZ, _rotationZ); D3DXMatrixRotationX(&m_matRotationX, _rotationX); D3DXMatrixRotationY(&m_matRotationY, _rotationY); } //----------------------------------------------------------------------------- // 名称: setTransForm() // 描述: 设置变换 //----------------------------------------------------------------------------- VOID D3DImage::setTransForm(INT _mode) { D3DXMATRIX matWorld; if( _mode == 0 ) { D3DXMATRIX matTranslate; D3DXMATRIX matScla; D3DXMATRIX matRotationZ; D3DXMATRIX matRotationX; D3DXMATRIX matRotationY; D3DXMatrixScaling(&matScla, ZOOM, ZOOM, ZOOM); D3DXMatrixTranslation(&matTranslate, 0, 0, 0); D3DXMatrixRotationZ(&matRotationZ, 0); D3DXMatrixRotationX(&matRotationX, 0); D3DXMatrixRotationY(&matRotationY, 0); D3DXMatrixMultiply(&matWorld, &matScla, &matRotationZ); D3DXMatrixMultiply(&matWorld, &matWorld, &matRotationX); D3DXMatrixMultiply(&matWorld, &matWorld, &matRotationY); D3DXMatrixMultiply(&matWorld, &matWorld, &matTranslate); } else { D3DXMATRIX matScla; D3DXMatrixScaling(&matScla, ZOOM, ZOOM, ZOOM); D3DXMatrixMultiply(&matWorld, &m_matScaling, &m_matRotationZ); D3DXMatrixMultiply(&matWorld, &matWorld, &m_matRotationX); D3DXMatrixMultiply(&matWorld, &matWorld, &m_matRotationY); D3DXMatrixMultiply(&matWorld, &matWorld, &m_matTranslate); D3DXMatrixMultiply(&matWorld, &matWorld, &matScla); } m_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); } //----------------------------------------------------------------------------- // 名称: setVertex() // 描述: 设置定点缓冲 //----------------------------------------------------------------------------- HRESULT D3DImage::setVertex() { // 自定义顶点缓冲数组 // 2D //CUSTOMVERTEX Vertices[] = //{ // {0.0f, 0.0f, 0.0f, 0xffffffff, 0.0f, 0.0f}, //左上 // {DEF_WIDTH, 0.0f, 0.0f, 0xffffffff, 1.0f, 0.0f}, //右上 // {0.0f, DEF_HEIGHT, 0.0f, 0xffffffff, 0.0f, 1.0f}, //左下 // {DEF_WIDTH, DEF_HEIGHT, 0.0f, 0xffffffff, 1.0f, 1.0f}, //右下 //}; // 3D CUSTOMVERTEX Vertices[] = { {-DEF_WIDTH/2, DEF_HEIGHT/2, 0.0f, 0xffffffff, 0.0f, 0.0f}, //左上 {DEF_WIDTH/2, DEF_HEIGHT/2, 0.0f, 0xffffffff, 1.0f, 0.0f}, //右上 {-DEF_WIDTH/2, -DEF_HEIGHT/2, 0.0f, 0xffffffff, 0.0f, 1.0f}, //左下 {DEF_WIDTH/2, -DEF_HEIGHT/2, 0.0f, 0xffffffff, 1.0f, 1.0f}, //右下 }; // 创建定点缓冲 if( FAILED( m_pd3dDevice->CreateVertexBuffer( sizeof( Vertices ), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) ) { return E_FAIL; } // 填充定点缓冲 VOID* pVertices; if( FAILED( m_pVB->Lock( 0, sizeof( Vertices ), ( void** )&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, Vertices, sizeof( Vertices ) ); m_pVB->Unlock(); return S_OK; } //----------------------------------------------------------------------------- // 名称: drawImage() // 描述: 绘制图片 //----------------------------------------------------------------------------- VOID D3DImage::drawImage(INT _mode, FLOAT _parameter) { switch(_mode) { case DT_INDEX: drawImageIndex((INT)_parameter); break; case DT_ANIME: drawImageAnime((INT)_parameter); break; case DT_ROTATION: drawImageRotation(_parameter); break; } } //----------------------------------------------------------------------------- // 名称: drawImageIndex() // 描述: 绘制单一帧图片 //----------------------------------------------------------------------------- VOID D3DImage::drawImageIndex(INT _index) { m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) ); m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); // 设置贴图 if (m_iMaxIndex != 0) m_pd3dDevice->SetTexture(0,m_pTexture[_index]); else m_pd3dDevice->SetTexture(0,NULL); // 绘制矩形 setTransForm(1); m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2); setTransForm(0); } //----------------------------------------------------------------------------- // 名称: drawImageAnime() // 描述: 绘制切帧动画 //----------------------------------------------------------------------------- VOID D3DImage::drawImageAnime(INT _delay) { if (m_iDelay < _delay) m_iDelay++; else { if (m_iCurrentIndex < m_iMaxIndex-1) { m_iCurrentIndex++; } else { m_iCurrentIndex = 0; } m_iDelay = 0; } m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) ); m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); // 设置贴图 if (m_iMaxIndex != 0) m_pd3dDevice->SetTexture(0,m_pTexture[m_iCurrentIndex]); else m_pd3dDevice->SetTexture(0,NULL); // 绘制矩形 setTransForm(1); m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2); setTransForm(0); } //----------------------------------------------------------------------------- // 名称: drawImageRotation() // 描述: 绘制旋转动画 //----------------------------------------------------------------------------- VOID D3DImage::drawImageRotation(FLOAT _rotation) { if (m_fRotationZ < 360) { m_fRotationZ += _rotation; } else { m_fRotationZ = m_fRotationZ - 360; } m_pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( CUSTOMVERTEX ) ); m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); // 设置贴图 if (m_iMaxIndex != 0) m_pd3dDevice->SetTexture(0,m_pTexture[0]); else m_pd3dDevice->SetTexture(0,NULL); // 旋转贴图 setRotation(m_fRotationZ,m_fRotationX,m_fRotationY); // 绘制矩形 setTransForm(1); m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2); setTransForm(0); }