MonoGame - 正确的SpriteFont缩放

时间:2016-03-15 14:26:01

标签: c# fonts scale monogame

我正在为我的游戏制作一个GUI,现在我停留在动画上。当鼠标悬停在它上面时我需要缩放字体,而当它没有时缩放它。这是我的代码:

// Update()
if (!IsDisabled)
{
    elapsedSecondsFast = (float)gameTime.ElapsedGameTime.TotalSeconds * 3;
    if (Size.Contains(InputManager.MouseRect))
    {
        scale += elapsedSecondsFast;
        if (scale >= 1.05f) scale = 1.05f;
    }
    else
    {
        scale -= elapsedSecondsFast;
        if (scale <= 1.0f) scale = 1.0f;
    }
}
// Draw()
if ((PrimaryFont != null) && (SecondaryFont != null) && (!string.IsNullOrEmpty(Text)))
{
    if (IsHovered) TextOutliner.DrawBorderedText(spriteBatch, SecondaryFont, Text, new Vector2(TextRectangle.X, TextRectangle.Y), ForeColor, 0.0f, new Vector2((SecondaryFont.MeasureString(Text).X / 2 * scale - SecondaryFont.MeasureString(Text).X / 2), (SecondaryFont.MeasureString(Text).Y / 2 * scale - SecondaryFont.MeasureString(Text).Y / 2)), scale);
    else TextOutliner.DrawBorderedText(spriteBatch, PrimaryFont, Text, new Vector2(TextRectangle.X, TextRectangle.Y), ForeColor, 0.0f, new Vector2(PrimaryFont.MeasureString(Text).X / 2 * scale - PrimaryFont.MeasureString(Text).X / 2, (PrimaryFont.MeasureString(Text).Y / 2 * scale - PrimaryFont.MeasureString(Text).Y / 2)), scale);
}

以上是GUIElement类,由我的Button类继承。让我简要解释一下我的代码:

  • PrimaryFontSecondaryFont是2个使用相同的SpriteFonts 字体但大小不同。这为我提供了我需要的放大/缩小动画,而不会模糊我的PrimaryFont
  • TextRectangleSize是两个不同的矩形。由于我的按钮具有纹理和文本,因此我决定不在纹理文件上绘制文本,而是让游戏将文本放在纹理上以“伪造”效果。因此TextRectangle是按钮文本的大小和位置,Size是按钮纹理的大小和位置。 TextRectanglecenter point的{​​{1}}中有center。到目前为止,我一直在使用魔术数字来实现这一目标。这是问题的核心。
  • 您可以看到我的Button texture,我将其传递给origin课程的DrawBorderedText方法。这些属性的顺序与TextOutliner次调用的顺序相同,只有spriteBatch.DrawString()SpriteEffects

问题

由于我正在缩放字体(我认为layerDepth),它将不再位于按钮的中心。而且由于我一直使用幻数来将未缩放的文本放在按钮纹理的中心上,所以我不想被迫为缩放文本做同样的事情。我正在寻找一种算法,它始终将文本放在我的270x72纹理中间,无论文本是否缩放,同时保持上面显示的origin = center动画, scale类的每个 实例。最好将其原点指向中心。

修改

所以我应该这样画:

Button

然后在if (IsHovered) TextOutliner.DrawBorderedText(spriteBatch, SecondaryFont, Text, new Vector2(TextRectangle.X, TextRectangle.Y), ForeColor, 0.0f, new Vector2((SecondaryFont.MeasureString(Text).X / 2), (SecondaryFont.MeasureString(Text).Y / 2)), scale); else TextOutliner.DrawBorderedText(spriteBatch, PrimaryFont, Text, new Vector2(TextRectangle.X, TextRectangle.Y), ForeColor, 0.0f, new Vector2(PrimaryFont.MeasureString(Text).X / 2, (PrimaryFont.MeasureString(Text).Y / 2)), scale);

处绘制按钮的文字

1 个答案:

答案 0 :(得分:2)

所以我最终自己找到了算法,最后消除了使用魔术数字作为文本位置的需要。这是我的技术:

TextOutliner.DrawBorderedText(spriteBatch, Font, Text, new Vector2(Size.X + ((Size.Width - Font.MeasureString(Text).X) / 2), Size.Y + ((Size.Height - Font.MeasureString(Text).Y)) / 2), ForeColor, 0.0f, new Vector2((Font.MeasureString(Text).X / 2 * scale - Font.MeasureString(Text).X / 2), (Font.MeasureString(Text).Y / 2 * scale - Font.MeasureString(Text).Y / 2)), scale);

我无法将@ scale等式中的origin取出@LibertyLocked建议,因为字体在鼠标悬停时从左上角开始缩放,而不是我想要的中心它来。