我正在为我的游戏制作一个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
类继承。让我简要解释一下我的代码:
PrimaryFont
和SecondaryFont
是2个使用相同的SpriteFonts
字体但大小不同。这为我提供了我需要的放大/缩小动画,而不会模糊我的PrimaryFont
。TextRectangle
和Size
是两个不同的矩形。由于我的按钮具有纹理和文本,因此我决定不在纹理文件上绘制文本,而是让游戏将文本放在纹理上以“伪造”效果。因此TextRectangle
是按钮文本的大小和位置,Size
是按钮纹理的大小和位置。 TextRectangle
在center 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);
答案 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建议,因为字体在鼠标悬停时从左上角开始缩放,而不是我想要的中心它来。