3

我有一些文本想要显示在游戏底部的某种日志中。

我想要一种方法来确保文本适合特定大小,如果超过那个大小,我会自己修剪它(“bla bla bl ...”)

我知道我可以通过使用 SpriteFont.MeasureString 获得文本将采用的大小 - 所以我知道特定字符串是否会超出限制。

最明显的解决方案涉及这种循环

StringBuilder display = new StringBuilder();

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

}

但是,我担心这种事情做起来非常昂贵。还有其他解决方案吗?

4

3 回答 3

3

您将不得不在某处使用 MeasureString,这只是您使用的算法的一个例子。天真的解决方案是从末尾裁剪一个字符,直到字符串适合。一个更好的建议是将它切成两半,看看它是否合适,然后以这种方式找到解决方案。另一种方法是测量一次字符串长度,然后根据字符串在边界外的比例进行近似。例如,如果您的限制是 100 像素,并且您有一个 400 像素宽的字符串,则裁剪字符串的最后 3/4(以字符为单位)。然后,通过删除或添加近似字符串的一半,并递归直到您在一个字符内,恢复到“因子 2”方法。对于大多数情况,这应该足够快,

于 2012-12-30T21:20:49.520 回答
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);
于 2012-12-30T17:57:56.933 回答
0

不知道它是否适用,XNAC#我会先检查长度 string.Length 是否大于我的限制,然后使用子字符串方法修剪它

string newString;

your method
{
  if(string.Length > mylimit)
  {
    newString = yourString.Substring(0, 3);
  }
}
于 2012-12-30T15:22:22.330 回答