2012-12-30 85 views
2

我有一些文本我想在遊戲底部的某種日誌中顯示。將文本修改爲特定尺寸

我要確保文本在特定一刀切的方式,並且如果超過該大小,我會修剪它自己(「喇嘛喇嘛BL ...」)

我知道我可以通過使用SpriteFont.MeasureString獲取文本的大小 - 所以我知道一個特定的字符串是否會超出限制。

最明顯的解決方案涉及這種

StringBuilder display = new StringBuilder(); 

foreach (char c in string) 
{ 
if mySpriteFont.MeasureString((display.Append(c)) > SOMEAMOUNT 
{ 
    display.append("..."); 
return display.toString(); 
} 

} 

但是我怕一個循環,這樣的事情是做的非常昂貴的。其他解決方案?

+1

根據您的字符串,首先檢查整個字符串可能會更快。如果沒有問題,請將其退回,否則請開始修剪。 – HABO

+0

對我來說,也只是發生,如果我倒退它也會節省一些循環(提供過長的字符串是例外,而不是常態)。但是有更好的方法嗎? – Haedrian

+1

另一個想法是二元分割:首先將字符串切成兩半,而不是逐個字符。如果合適,加一個四分之一的背部,如果不能再將它切成兩半等等。效率取決於琴絃的長度和窗口的大小。 – Rotem

回答

2

你將不得不在那裏使用MeasureString,它只是你使用的算法的一個例子。令人生厭的解決方案是隻剪出一個字符,直到字符串適合。一個更好的建議是將其裁剪一半,看看它是否合適,然後以這種方式迴歸解決方案。另一種方法是一次測量字符串長度,然後根據字符串在邊界之外的比例進行近似。例如,如果您的限制爲100像素,並且您有一個寬度爲400像素的字符串,則會裁剪最後一個3/4字符串(以字符爲單位)。然後,通過刪除或添加近似字符串的一半來恢復「2因子」方法,並遞歸直到您在一個字符之內。對於大多數情況,這應該足夠快,而近似階段可以很好地消除初始開銷,特別是如果字符串很長,並且在某些情況下可能會立即顯示結果。

0

不知道它在XNA適用,但C#我會首先檢查長度 string.Length 如果不是我的極限大於使用子方法

string newString; 

your method 
{ 
    if(string.Length > mylimit) 
    { 
    newString = yourString.Substring(0, 3); 
    } 
} 
+0

這仍然有效。但是不是字符串'修改'非常昂貴,因爲你(內部)每次都需要創建一個新的字符串? – Haedrian

+0

編輯代碼。現在不會很貴。 –

+2

你在說蘋果和橘子。 OP想要測量的大小,您正在計算字符數量的長度。 – davehale23

0

的唯一方法修剪我知道如何通過SpriteFont.MeasureString("text")來測量字符串的長度。如果你爲每一幀處理大量的字符串,它可能會很昂貴,但是如果你只做一次這樣的處理,並將結果字符串保存到字典,數組或列表中,從每一幀你可以得到它們的地方,它會很多不會那麼貴。

例如,您有"a very long string that doesn't fit into a small text box"。你讓它

a very long string 
that doesn't fit 
into a small text 
box 

,並把它變成一個Dictionary<string, string>與你解析初始字符串的關鍵。然後你可以像這樣使用它:

if (ParsedStringDic.ContainsKey(unparsedString)) 
    displayedString = ParsedStringDic[unparsedString]; 
else 
    ParseString(unparsedString);