如何突出显示spritefont中的部分文本

时间:2012-05-05 10:54:01

标签: c# textbox xna highlight spritefont

我在xna工作,我的问题如下。我得到了第一次出现的文本 “ _ __ _ ____ ”应该以某种方式为用户提供高亮度。这可以通过使这个部分的字体大小更大,突出显示或其他方式,如果有人有一个好主意。

public void DrawStringWithStyle(SpriteBatch batch, SpriteFont thisFont, Vector2 pos, string thisText, SpriteFont BoldFont)
    {
        string[] paragraphs = Regex.Split(thisText, @"\\(c[a-fA-F0-9]{6})|\\(b)|\\(o)|\\(l)");
        SpriteFont CurrentFont = font;
        float tempPosX = pos.X;

        for (int i = 0; i < paragraphs.Length; i++)
        {
            batch.DrawString(CurrentFont, paragraphs[i], new Vector2(tempPosX, pos.Y), Color.Black);

            if (i + 1 < paragraphs.Length)
            {
                tempPosX += CurrentFont.MeasureString(paragraphs[i]).X;

                i++;

                switch (char.ToLower(paragraphs[i][0]))
                {
                    case 'o': CurrentFont = font; break;
                    case 'b': CurrentFont = BoldFont; break;
                    case 'l':
                        paragraphs[i+1] = paragraphs[i+1].Insert(0, Environment.NewLine);
                        tempPosX = pos.X;
                        break;
                }
            }
        }
    }

所以我有两个新问题,你可能会说。其中一个是2个命令连续出现,因为它会搞砸大时间,需要能够检查下一个是命令还是某个正常段落。另一个问题需要一个解决方案,因为我的(l)命令仅在以下段落不是命令时才有效。关于如何解决我的2个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

拆分具有不同样式的文本...并使用其样式绘制每个部分。

您可以使用\ c更改颜色:“我的\ cFF5566favaourite \ cFFFFFFgame是\ c444444warcraft 3”,或者\ b使用粗体字体...

public static void DrawStringWithStyle( this SpriteBatch batch, SpriteFont font, Vector2 pos, string text, Color color, SpriteFont BoldFont=null )
{
    string[] paragraphs = Regex.Split( text, @"\\(c[a-fA-F0-9]{6})|\\(b)|\\(n)" );
    Color CurrentColor = color;
    SpriteFont CurrentFont = font;

    for ( int i=0; i< paragraphs.Length; i++ )
    {
        batch.DrawString( CurrentFont, paragraphs[i], pos, CurrentColor );

        if ( i+1<paragraphs.Length )
        {
            pos.X += CurrentFont.MeasureString( paragraphs[i] ).X;
            i++;

            switch (char.ToLower(paragraphs[i][0]))
            {
                case 'c':
                    CurrentColor.R = byte.Parse( paragraphs[i].Substring( 1, 2 ) );
                    CurrentColor.G = byte.Parse( paragraphs[i].Substring( 3, 2 ) );
                    CurrentColor.B = byte.Parse( paragraphs[i].Substring( 5, 2 ) );
                    break;
                case 'n': CurrentFont = font; break;
                case 'b': CurrentFont = BoldFont; break;
            }
        }
    }
}