2012-05-05 11 views
1

Imは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つのコマンドが大舞台になり、次がコマンドかどうかを確認できる必要があるか、または何らかの理由でその通常の段落が存在するためです。 my(l)コマンドは、次の段落がコマンドでない場合にのみ機能するため、もう1つの問題は非常に似ています。私の2つの問題を解決する方法に関するアイデア?

+0

申し訳ありませんが、私の英語はには十分ではありませんあなたを理解する。行に2つのコマンドを使用できないのはなぜですか?なぜコマンドlに改行を挿入するのですか?私はtempPos.X = pos.Xのようなことは簡単だと思います。 tempPos.Y + = CurrentFont.VerticalLineSpace; – Blau

+0

はい、しばらくしてから、2つのコマンドがすぐ後に来ると、それらの間に ""からなる段落が作成されることが分かりました。 Didntはそれを知っていて、それが問題だったので、それを修正しました。しかし、どうもありがとう – Drakthal

+0

コマンドが開始時に同じ場合は同じですが、なぜそれは問題ですか? Spritebatch.drawstringが、段落が0より大きい場合に> 0を描画するかどうかをチェックすると、コードが簡単になります。 – Blau

答えて

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; 
      } 
     } 
    } 
} 
+0

これは素晴らしいアイデアのようですが、Blau手の込んだ!私はuser1322838が最初からこれをコード化できるかどうか分からないので、コードに入れることができれば、あるいはそれを実装する方法についてのアイディアを与えることができればいいでしょう。 – neeKo

+1

Ok ...私はやる...しかし、彼は自分でそれをしたいと思うかもしれない::) – Blau

+0

答えのおかげで多くは非常に有用だった;) – Drakthal

関連する問題