接口原型描述如下:
HRESULT Draw( LPDIRECT3DTEXTURE9 pTexture, CONST RECT * pSrcRect, CONST D3DXVECTOR3 * pCenter, CONST D3DXVECTOR3 * pPosition, D3DCOLOR Color );
PTexture:需要往Backbuffer上面绘制的Texture;
pSrcRect:pTexture需要绘制的区域,如果为NULL,全部绘制;
pCenter:pTexture的中心,是以pTexture左上角为坐标原点;
pPosition:pTexture需要绘制的位置,以backbuffer左上角为中心;
Color:该值用来乘以pTexture的颜色分量,通常为0xffffffff,不影响pTexture的颜色;
下面介绍一下在ID3DXSprite::Begin()未指定D3DXSPRITE_OBJECTSPACE标志,也就是在屏幕坐标系下绘制的情况:
此处的精灵图片是一个128*128大小的图片,如下图,例子中给出的Backbuffer大小为800*600.
下面给出在pCenter和pPosition为不同参数时的输出结果:
D3DXVECTOR3 vCenter = D3DXVECTOR3(0.f, 0.f, 0.f); D3DXVECTOR3 vPosion = D3DXVECTOR3(0.f, 0.f, 0.f);
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f); D3DXVECTOR3 vPosion = D3DXVECTOR3(0.f, 0.f, 0.f);D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f); D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);通过上述三种情况可以看出,pCenter是以图片自身左上角为原点的,并且pPosition指定了图片在backbuffer中的位置,也就是pCenter放置的位置。下面介绍一下ID3DSSprite::SetTransform(),该接口指定了绘制时如何对PTexture做变换,注意变换的中心是以屏幕左上角为中心的。下面给出接个例子:D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f); D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);//旋转矩阵 D3DXMATRIX R; D3DXMatrixRotationZ(&R, 0.7f);g_pSprite->SetTransform(&R);D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f); D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);//平移矩阵 D3DXMATRIX T, TInv; D3DXMatrixTranslation(&T, -400.f, -300.f, 0.f); D3DXMatrixInverse(&TInv, NULL, &T);
//旋转矩阵 D3DXMATRIX R; D3DXMatrixRotationZ(&R, 0.7f);
//放缩矩阵 D3DXMATRIX S; D3DXMatrixScaling(&S, 1.5f, 1.5f, 1.f);
D3DXMATRIX Trans; D3DXMatrixIdentity(&Trans);
Trans = T * R * TInv;
g_pSprite->SetTransform(&Trans);通过上述例子可以看出,SetTransform设置的变换是以屏幕左上角为中心变换的。还需要注意的是在每次调用SetTransform时最好使用g_pSprite->GetTransform(&matOld);保存之前的变换,等Draw结束后再设置回来,以防止出现相互影响。上述的讲解都是基于ID3DXSprite::Begin()未指定D3DXSPRITE_OBJECTSPACE标志的情况下,也就是以屏幕为坐标系的情况下,如果设置了D3DXSPRITE_OBJECTSPACE标志,上述描述不具备参考性。