2013-04-13 2 views
4

XNA에는 의 너비와 높이를 반환 할 수있는 MeasureString 메서드가있는 Spritefont 클래스가 있습니다. 적절한 너비와 높이 (Rectangle이 매개 변수로 사용됨)에 맞는 경우 Environment.Newline이 올바른 위치에 삽입 된 문자열을 효율적으로 반환하는 메서드를 만드는 방법을 이해하려고합니다. 또한 LINEBREAK 하나의 단어를워드 랩은 어떻게 구현합니까?

public static string WrapText(SpriteFont font, string text, float maxLineWidth) 
    { 
     string[] words = text.Split(' '); 
     StringBuilder sb = new StringBuilder(); 
     float lineWidth = 0f; 
     float spaceWidth = font.MeasureString(" ").X; 

     foreach (string word in words) 
     { 
      Vector2 size = font.MeasureString(word); 

      if (lineWidth + size.X < maxLineWidth) 
      { 
       sb.Append(word + " "); 
       lineWidth += size.X + spaceWidth; 
      } 
      else 
      { 
       if (size.X > maxLineWidth) 
       { 
        if (sb.ToString() == "") 
        { 
         sb.Append(WrapText(font, word.Insert(word.Length/2, " ") + " ", maxLineWidth)); 
        } 
        else 
        { 
         sb.Append("\n" + WrapText(font, word.Insert(word.Length/2, " ") + " ", maxLineWidth)); 
        } 
       } 
       else 
       { 
        sb.Append("\n" + word + " "); 
        lineWidth = size.X + spaceWidth; 
       } 
      } 
     } 

     return sb.ToString(); 
    } 
+1

이 [XNA Word Wrapping] (http://www.xnawiki.com/index.php/Basic_Word_Wrapping)을 발견했습니다. 일부 [코드] (http://xboxforums.create.msdn.com/forums/p/10536/55295.aspx)가있는 다른 스레드. –

+0

@AlinaB. 고마워, 그건 내 문제를 실제로 해결! 위키가 사라질 경우를 대비하여 해당 페이지의 코드를 답으로 게시해야합니다. 대답은 당신에게 달려 있습니다. – user1306322

답변

7

나는 다음과 같은 코드를 발견 캐리지 리턴을 사용하여 텍스트 블록을 처리하려면 다음과 같이 코드를 수정해야합니다.

public static string WrapText(SpriteFont font, string text, float maxLineWidth) 
    { 
     string[] words = text.Split(' '); 
     StringBuilder sb = new StringBuilder(); 
     float lineWidth = 0f; 
     float spaceWidth = font.MeasureString(" ").X; 

     foreach (string word in words) 
     { 
      Vector2 size = font.MeasureString(word); 

      if (word.Contains("\r")) 
      { 
       lineWidth = 0f; 
       sb.Append("\r \r"); 
      } 

      if (lineWidth + size.X < maxLineWidth) 
      { 
       sb.Append(word + " "); 
       lineWidth += size.X + spaceWidth; 
      } 

      else 
      { 
       if (size.X > maxLineWidth) 
       { 
        if (sb.ToString() == " ") 
        { 
         sb.Append(WrapText(font, word.Insert(word.Length/2, " ") + " ", maxLineWidth)); 
        } 
        else 
        { 
         sb.Append("\n" + WrapText(font, word.Insert(word.Length/2, " ") + " ", maxLineWidth)); 
        } 
       } 
       else 
       { 
        sb.Append("\n" + word + " "); 
        lineWidth = size.X + spaceWidth; 
       } 
      } 
     } 

     return sb.ToString(); 
    } 
2

, 여기에 기능의 확장 버전은 다음과 같습니다

0

maxLineWidth보다 긴 것 그, 알리의 대답에 추가하려면 XNA - Basic Word Wrapping

public string WrapText(SpriteFont spriteFont, string text, float maxLineWidth) 
{ 
    string[] words = text.Split(' '); 
    StringBuilder sb = new StringBuilder(); 
    float lineWidth = 0f; 
    float spaceWidth = spriteFont.MeasureString(" ").X; 

    foreach (string word in words) 
    { 
     Vector2 size = spriteFont.MeasureString(word); 

     if (lineWidth + size.X < maxLineWidth) 
     { 
      sb.Append(word + " "); 
      lineWidth += size.X + spaceWidth; 
     } 
     else 
     { 
      sb.Append("\n" + word + " "); 
      lineWidth = size.X + spaceWidth; 
     } 
    } 

    return sb.ToString(); 
} 
+0

수정 해 주셔서 감사합니다. 그러나'''sb.Append ("\ r \ r");'''부분은 왜 좋은가요? 단어 사이에 이중 공백을 추가하기 만하면됩니다. 왜'''sb.Append ("\ r");'''(적어도 예제에서는 체크하지 않으면 여분의 공백없이 동일하게 작동합니다). –