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を使用する必要があります。これは、使用するアルゴリズムの場合にすぎません。単純な解決策は、文字列が収まるまで最後から1文字を切り取るだけです。提案されているより良い方法は、半分に切り取って、それが適合するかどうかを確認し、その方法で解決策に取り組むことです。別の方法としては、文字列の長さを1回測定してから、境界の外側にある文字列の比率に基づいて概算を取ります。たとえば、制限が100ピクセルで、幅が400ピクセルの文字列がある場合は、文字列の最後の3/4(文字数)を切り取ります。次に、近似文字列の半分を削除または追加し、1文字以内になるまで繰り返して、「2の因数」アプローチに戻します。これはほとんどの場合に十分な速さであるはずです、

于 2012-12-30T21:20:49.520 に答える
0

文字列の長さを。で測定する方法を知っている唯一の方法SpriteFont.MeasureString("text")。多くの文字列に対してフレームごとに実行するとコストがかかる可能性がありますが、これを1回だけ実行し、結果の文字列を辞書、配列、またはリストに保存して、フレームごとに取得できるようにすると、コストが高くなります。より安価な。

たとえば、があります"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

それがに適用できるかどうかはわかりませんXNAが、C#私は最初に長さ string.Length が私の制限よりも大きいかどうかをチェックし、次に部分文字列メソッドを使用してそれをトリミングします

string newString;

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