C# Xna用sprite字体实现desent scale效果

C# Xna achieve a desent scale effect with sprite fonts

所以我正在为我的游戏制作菜单。这是单个按钮的代码:

// button class
public class ButtonGUI
{
    public SpriteFont spriteFont;
    string btnTxt;
    public Rectangle btnRect;
    Color colour;

    public ButtonGUI(string newTxt, Rectangle newRect, SpriteFont newSpriteFont, Color newColour)
    {
        spriteFont = newSpriteFont;
        btnRect = newRect;
        btnTxt = newTxt;
        colour = newColour;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        // TextOutliner() is a static helper class for drawing bordered spritefonts I made
        TextOutliner.DrawBorderedText(spriteBatch, spriteFont, btnTxt, btnRect.X, btnRect.Y, colour);
    }
}

// TitleScreen.cs
ButtonGUI btnPlay, btnPlay_2;
bool indexPlay;
string[] menuTxt;
SpriteFont GameFontLarge, GameFontLargeHover;

// LoadContent() method:
// Load both spritefonts....

menuTxt = new string[4];
menuTxt[0] = "Play Game";
menuTxt[1] = "Achievements";
menuTxt[2] = "Settings";
menuTxt[3] = "Exit Game";

btnPlay = new ButtonGUI(menuTxt[0], new Rectangle(150, 300, (int)GameFontLarge.MeasureString(menuTxt[0]).X, (int)GameFontLarge.MeasureString(menuTxt[0]).Y), GameFontLarge, Color.White);
btnPlay_2 = new ButtonGUI(menuTxt[0], new Rectangle(150, 300, (int)GameFontLargeHover.MeasureString(menuTxt[0]).X, (int)GameFontLargeHover.MeasureString(menuTxt[0]).Y), GameFontLargeHover, Color.Yellow);

// Update() method:
MouseState mouseState = Mouse.GetState();
Rectangle mouseRect = new Rectangle(mouseState.X, mouseState.Y, 1, 1);

if (mouseRect.Intersects(btnPlay.btnRect))
{
    indexPlay = true;
    if (mouseState.LeftButton == ButtonState.Pressed) Game1.CurrentGameState = Game1.GameState.playScreen;
}
else indexPlay = false;

// Draw() method:
if (indexPlay)
{
    btnPlay_2.Draw(spriteBatch);
}
else btnPlay.Draw(spriteBatch);

所以我为 4 个不同的按钮做了所有这些。 2 种 sprite 字体是相同的字体,但 大小不同 。现在,当我测试游戏时,当我将鼠标悬停在每个按钮上时,文本会从白色变为黄色并变大。但是由于按钮坐标是用 x = left-most; y = top-most 完成的,所以当字体发生变化时,较大的字体将绘制在与较小字体相同的位置。我想在鼠标悬停时获得不错的 "scale" 效果。我的意思是我知道我在初始化时将按钮位置设置为那个位置,但我仍然需要某种算法来找到一种方法并在旧字体的中心绘制更大的字体......你的方法是什么?

您可以根据大小差异更改悬停按钮的位置:

var sizeDifference = btnPlay_2.btnRect.Size - btnPlay.btnRect.Size;
btnPlay_2.btnRect.Offset(-sizeDifference.X/2, -sizeDifference.Y/2);