我有一些文字要显示在游戏底部的某种日志中。
我想要一种确保文字符合特定尺寸的方法,如果超过这个尺寸,我会自己修剪(“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();
}
}
然而,我担心这种事情非常昂贵。还有其他解决方案吗?
答案 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);