|
|
发表于 2007-8-13 09:57:00
|
显示全部楼层
Re: ???sprite如何使用旋?
void CDisplayD3D9: rawImage( int left, int top, HIMG hImg, DWORD effect, DWORD dwColor )
{
CD3DImage*pImg = g_D3DImgMgr.GetImg(hImg);
if( NULL == pImg ) return;
if( NULL == pImg->GetTex() ) return;
D3DXVECTOR3 pos;
pos.x = (float)left;
pos.y = (float)top;
pos.z = 0;
bool bScale = ( 1.0f != m_vScale.x || 1.0f != m_vScale.y );
bool bRot = ( 0 != m_fRotate );
if( bScale || bRot )
{
bool bCenter = ( m_vCenter.x != 0 || m_vCenter.y != 0 );
if( bCenter )
{
D3DXMATRIXA16 matCenter;
D3DXMatrixTranslation( &matCenter, -m_vCenter.x-pos.x, -m_vCenter.y-pos.y, 0 );
m_matTrans = matCenter;
}
else
{
D3DXMatrixIdentity( &m_matTrans );
}
if( bScale )
{
D3DXMATRIXA16 matScale;
D3DXMatrixScaling( &matScale, m_vScale.x, m_vScale.y, m_vScale.z );
m_matTrans *= matScale;
}
if( bRot )
{
D3DXMATRIXA16 matRot;
D3DXMatrixRotationZ( &matRot, m_fRotate );
m_matTrans *= matRot;
}
if( bCenter )
{
D3DXMATRIXA16 matCenter;
D3DXMatrixTranslation( &matCenter, m_vCenter.x+pos.x, m_vCenter.y+pos.y, 0 );
m_matTrans *= matCenter;
}
}
else
{
D3DXMatrixIdentity( &m_matTrans );
}
g_pSprite->SetTransform( &m_matTrans );
_change_render_state( effect&fxBlendMask );
if( effect & fxTexTex ) dwColor = 0xffffffff;//use texture color
g_pSprite->Draw( pImg->GetTex(), pImg->GetImgRect(), &m_vCenter, &pos, dwColor );
}
二个问题注意
1. SetTransform和Draw里的pos和center会互相影响,建议是在原点进行rot/scale
2. SetTransform会影响之后的所有Sprite Draw
最后
单纯画2DSprite,ID3DXSprite不如自己写的效率高,具体可以参考HGE Source中的代码 |
|