我正在制作一个 2D 横向滚动游戏(DirectX 10),所以我想在 Y 轴上翻转精灵。由于某种原因,当我在 Y 或 X 方向上指定负缩放值时,精灵不会绘制,但如果我为两者指定正缩放值或负缩放值,它就可以正常绘制。我不认为这是精灵在屏幕外的情况,因为我已经检查了 matWorld 中的值并且它总是在我的视口的值范围内。
设置 matWorld 的代码如下:
D3DXMATRIX matTranslation;
D3DXMatrixTranslation(&matTranslation, static_cast<float>(m_X), static_cast<float>(m_Y), m_Z );
D3DXMATRIX matTranslationPointMove;
D3DXMatrixTranslation(&matTranslationPointMove, 0.5f, 0.5f, 0.1f);
D3DXMATRIX matScaling;
D3DXMatrixScaling(&matScaling, static_cast<float>(m_Width) * m_ScaleX, static_cast<float>(m_Height) * m_ScaleY, 1.0f);
m_Sprite.matWorld = matTranslationPointMove * matScaling * matTranslation;
对于一些不同的缩放值,matWorld 看起来像这样(格式化道歉..):
ScaleX=ScaleY = 1 ---- ScaleX=ScaleY = -1 ------------ ScaleX=-1, ScaleY=1
[24 0 0 0] ---------------- [-24 0 0 0] ------------------------ [-24 0 0 0 ]
[0 18 0 0] ---------------- [0 -18 0 0] ------------------------ [0 18 0 0 ]
[0 0 1 0 ] ----------------- [0 0 1 0 ] ------------------------- [0 0 1 0 ]
[12 52 0.6 1 ] ----------- [-12 52 0.6 1 ] ------------------- [-12 52 0.6 1 ]
绘图代码如下所示:
m_pDevice->ClearRenderTargetView(m_pRenderTargetView, D3DXCOLOR(1.0f, 1.0f, 1.0f, 0.0f));
HRESULT hr = NULL;
D3DXMATRIX matProjection;
D3DXMatrixOrthoOffCenterLH(&matProjection,
-400.0f,
800.0f,
-400.0f,
800.0f,
0.1f,
10.0f
);
hr = m_ISprite->SetProjectionTransform(&matProjection);
if (FAILED(hr)) OutputDebugStringA("NOOooooo");
m_ISprite->Begin(D3DX10_SPRITE_SORT_DEPTH_BACK_TO_FRONT);
spriteVector::iterator it = spritesToDraw.begin();
while( it != spritesToDraw.end() )
{
m_ISprite->DrawSpritesBuffered(*it, 1);
++it;
}
m_ISprite->Flush();
m_ISprite->End();
m_pSwapChain->Present(0,0);
我完全不知道出了什么问题,所有的价值观对我来说都是正常的。我做错了什么,还是有其他方法可以做到这一点?如果我也必须手动为所有精灵设置动画,那将是悲伤的一天。提前谢谢!