我正在为我的游戏做一个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在center of Button texture中。到目前为止,我一直在使用神奇的数字来实现这一点。这是问题的核心所在。origin,我把它传递给了我的TextOutliner类的DrawBorderedText方法。属性的顺序与spriteBatch.DrawString()调用相同,只是没有SpriteEffects和layerDepth。问题
由于我正在缩放字体(我想是origin = center),它将不再位于按钮的中心。由于我一直在使用神奇的数字定位非缩放文本的中心按钮纹理,我不想被强迫做同样的事情对缩放的文本。我正在寻找一种算法,它总是将文本定位在我的270x72纹理的中间,无论文本是否缩放,同时保持上面显示的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);然后在btn.Size.Width / 2, btn.Size.Height / 2, (int)MainGame.GameFontLarge.MeasureString("Play").X / 2, (int)MainGame.GameFontLarge.MeasureString("Play").Y / 2绘制按钮的文本
发布于 2016-03-16 18:59:35
因此,我最终找到了自己的算法,并最终消除了使用幻数作为文本位置的需要。以下是我的技巧:
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建议的那样把scale从origin方程中拿出来,因为字体是从左上角缩放到鼠标Hover,而不是我想要的中心。
https://stackoverflow.com/questions/36014074
复制相似问题