将文本修剪为特定大小

时间:2012-12-30 15:01:40

标签: c# xna

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

我想要一种确保文字符合特定尺寸的方法,如果超过这个尺寸,我会自己修剪(“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();
}

}

然而,我担心这种事情非常昂贵。还有其他解决方案吗?

3 个答案:

答案 0 :(得分:3)

你必须在那里使用MeasureString,这只是你使用的算法的一个例子。最直接的解决方案是直接裁掉一个字符,直到字符串适合。一个更好的建议就是把它裁剪成两半,看看它是否合适,然后回答解决方案。另一种方法是测量字符串长度一次,然后根据边界外字符串的比例进行近似。例如,如果您的限制为100像素,并且您有一个400像素宽的字符串,则裁剪字符串的最后3/4(以字符为单位)。然后,通过删除或添加一半近似字符串,然后递归直到你在一个字符内,恢复到“因子2”方法。对于大多数情况,这应该足够快,并且近似阶段可以很好地消除初始开销,特别是如果你的字符串很长,并且在某些情况下可以证明立即给出结果。

答案 1 :(得分:0)

不知道它是否适用于XNA,但在C#我会首先检查长度 string.Length 如果它大于我的限制,则使用子串方法

修剪它
string newString;

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

答案 2 :(得分: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);