首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

ID3DXSprite接口不理解的地方 望指点解决办法

2012-03-21 
ID3DXSprite接口不理解的地方 望指点HRESULT Draw(LPDIRECT3DTEXTURE9 pTexture,CONST RECT * pSrcRect,CO

ID3DXSprite接口不理解的地方 望指点
HRESULT Draw(
  LPDIRECT3DTEXTURE9 pTexture,
  CONST RECT * pSrcRect,
  CONST D3DXVECTOR3 * pCenter,
  CONST D3DXVECTOR3 * pPosition,
  D3DCOLOR Color
);
这个函数只指示了来源图像区域,而没有目标图像区域
所以要对来源图像拉伸时候必须使用ID3DXSprite::SetTransform,而使用矩阵变换都只能设置一个
缩放的百分比值.

问题来了
在GDI和DDARW时代,一般只要设置RECT DestRect来表示要绘制到目标图像的那个区域
如果来源图像小于这个RECT DestRect,那么会自动拉伸缩放到合适尺寸

难道用ID3DXSprite绘制图像时候,必须还要自己手工的计算缩放百分比?
既影响性能 又不精确,请教前辈 这种情况一般怎么处理

[解决办法]
ID3DXSprite使用SetTranform来设置目标图像的大小,绘制的位置则由position决定。
下面是DX SDK中的一段代码,我稍微整理了一下,加上了注释.

C/C++ code
//要绘制的纹理区域    RECT rcTexture = rcTexture;    //绘制到屏幕上的区域    RECT rcScreen = *prcDest;    OffsetRect( &rcScreen, m_x, m_y );    //要绘制的纹理    D3DXTexture9* pTexture9 = GetTexture( pElement->iTexture );    if( pTexture9 == NULL )        return E_FAIL;    //计算纹理绘制时的缩放    float fScaleX = ( float )RectWidth( rcScreen ) / RectWidth( rcTexture );    float fScaleY = ( float )RectHeight( rcScreen ) / RectHeight( rcTexture );    //建立缩放矩阵    D3DXMATRIXA16 matTransform;    D3DXMatrixScaling( &matTransform, fScaleX, fScaleY, 1.0f );    //设置矩阵    m_pSprite->SetTransform( &matTransform );    //计算绘制的位置    D3DXVECTOR3 vPos( ( float )rcScreen.left, ( float )rcScreen.top, 0.0f );    vPos.x /= fScaleX;    vPos.y /= fScaleY;    //绘制    return m_pSprite->Draw( pTexture9, &rcTexture, NULL, &vPos,TextureColor ); 

热点排行