DirectX精灵在缩放时呈现在不同的位置

DirectX Sprite renders in a different position when scaled

本文关键字:位置 精灵 缩放 DirectX      更新时间:2023-10-16

目前正在为一款游戏制作一些UI类和UI元素,并且在使用DirectX 9缩放精灵时遇到了一个问题。

现在我有一个ID3DXSprite*对象(m_barImage),它是一个生命条。显然,随着玩家生命值的变化,生命条需要变长/变短。

我在Update()函数中有这个

  // Calculate the width of the bar taking into account the health amount
  float width = (m_maxWidth / 100.0f) * m_percentageFull;
  // compare last width with m_currentWidth to get a scaling ratio
  float resizeRatio = width / m_currentWidth;
  m_currentWidth = width;
  Matrix scaleMatrix;
  D3DXMatrixScaling(&scaleMatrix, resizeRatio, 1.0f, 1.0f);
  m_barImage->SetTransform(&scaleMatrix);

在我的Render()函数中我有

  m_barImage->Begin(NULL);
  m_barImage->Draw(m_texture, NULL, NULL, &m_position, 0x007F17);
  m_barImage->End();

我的问题是,当我在X轴上缩小精灵的大小时,精灵被渲染的位置会向左移动。

注意:m_position是在构造函数中设置的精灵的位置,它不会改变

缩放精灵时改变了它呈现的位置。

有人能帮忙吗?

我认为你应该多读一些关于矩阵变换的基础知识。

通过设置变换矩阵,你正在缩放整个坐标空间,因此你的位置也受到缩放的影响,这导致了不必要的移动。你应该让绘图调用的位置保持自由,并使用平移矩阵(将其移动到正确的位置)乘以缩放矩阵(调整大小)来转换精灵。因此,在精灵移动之前调整大小,因此缩放不会应用于平移。

有关转换的更多详细信息,请查看以下文档