1

私は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つの新しい問題を抱えています。そのうちの1つは、2つのコマンドが連続して来ることです。これは、大きな問題が発生し、次のコマンドがコマンドであるか、それとも通常の段落であるかを確認できる必要があるためです。私の(l)コマンドは次の段落がコマンドでない場合にのみ機能するため、他の問題にはそのような解決策が必要です。私の2つの問題を解決する方法について何かアイデアはありますか?

4

1 に答える 1

2

スタイルの異なるテキストを分割し、各部分をそのスタイルで描画します。

\c を使用して色を変更できます: 「My \cFF5566favaourite \cFFFFFFgame is \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;
            }
        }
    }
}
于 2012-05-05T13:38:01.013 に答える