首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoGame -适当的SpriteFont缩放

MonoGame -适当的SpriteFont缩放
EN

Stack Overflow用户
提问于 2016-03-15 14:26:01
回答 1查看 1.9K关注 0票数 2

我正在为我的游戏做一个GUI,现在我被动画困住了。当鼠标悬停在它上面时,我需要缩放字体,当它不是的时候,我需要缩小字体。这是我的密码:

代码语言:javascript
复制
// 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 pointcenter of Button texture中。到目前为止,我一直在使用神奇的数字来实现这一点。这是问题的核心所在。
  • 您可以看到我的origin,我把它传递给了我的TextOutliner类的DrawBorderedText方法。属性的顺序与spriteBatch.DrawString()调用相同,只是没有SpriteEffectslayerDepth

问题

由于我正在缩放字体(我想是origin = center),它将不再位于按钮的中心。由于我一直在使用神奇的数字定位非缩放文本的中心按钮纹理,我不想被强迫做同样的事情对缩放的文本。我正在寻找一种算法,它总是将文本定位在我的270x72纹理的中间,无论文本是否缩放,同时保持上面显示的scale动画,对于Button类的每个实例。最好在中心有它的起始点。

编辑

所以我应该这样画:

代码语言:javascript
复制
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);

然后在btn.Size.Width / 2, btn.Size.Height / 2, (int)MainGame.GameFontLarge.MeasureString("Play").X / 2, (int)MainGame.GameFontLarge.MeasureString("Play").Y / 2绘制按钮的文本

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-16 18:59:35

因此,我最终找到了自己的算法,并最终消除了使用幻数作为文本位置的需要。以下是我的技巧:

代码语言:javascript
复制
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);

我不能像@LibertyLocked建议的那样把scaleorigin方程中拿出来,因为字体是从左上角缩放到鼠标Hover,而不是我想要的中心。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36014074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档