私はゲームを作っており、XMLファイルからダイアログテキストを読みます。テキストボックスに収まるように、必要に応じて改行を自動的に追加するルーチンを作成しようとしています。ただし、正しく機能しません。現在のコードは次のとおりです。
SpriteFont dialogueFont = font31Adelon;
int lastSpace = 0;
string builder = "";
string newestLine = "";
float maxWidth = 921.6f;
float stringLength = 0;
for (int i = 0; i <= speech.Length - 1; i++) //each char in the string
{
if (speech[i] == ' ') //record the index of the most recent space
{
lastSpace = i;
}
builder += speech[i];
newestLine += speech[i];
stringLength = dialogueFont.MeasureString(newestLine).X;
if (stringLength > maxWidth) //longer than allowed
{
builder = builder.Remove(lastSpace); //cut off from last space
builder += Environment.NewLine;
i = lastSpace; //start back from the cutoff
newestLine = "";
}
}
speech = builder;
私のテスト文字列は、「これは、正しく複数行に分割する必要がある長いスピーチの例です。これは数行の長さであり、単なる例のテキストであるため、重要なことは何も言いません。」
これがスピーチがどのように見えるかです:http: //www.iaza.com/work/120627C/iaza11394935036400.png
最初の行は、たまたま限界を超えたスペースなのでうまくいくと思います。
i=81およびlastSpace=80は、2行目が終了する場所です。.Removeコマンドの前のビルダーは次のようになります:「これは長いスピーチの例であり、\ r\n複数の行に分割する必要がありますc」
実行すると、次のようになります。「これは、\ r\n複数の行に分割する必要がある長いスピーチの例です」
3行目は、i=123およびlastSpace=120でサイズ制限を超えています。.Removeの前は次のようになります: "これは、\ r\n複数行に分割する必要がある長いスピーチの例です\r\正しくありません。数行の長さです。」
以降:「これは、\ r\n複数の行に正しく分割する必要がある\r\n長いスピーチの例です。\r\n数行の長さです。」
ご覧のとおり、余分な文字は切り取られますが、そのスペースである文字80が削除を開始することになっています。私が読んだものから.Removeは、単一のパラメーターで呼び出されると、指定されたインデックスを含むすべてのものを切り取ります。ただし、i=79もカットしています。これを補うためにlastSpaceに加算または減算するのは簡単なようですが、「インデックスの範囲外」エラーが発生するか、さらに多くの文字を切り取ります。.Remove(lastSpace、i-lastSpace)を実行しようとしましたが、それも機能しません。lastSpaceに加算または減算することにより、「スペースで終わる」ケースを他のケースとは異なる方法で処理しようとしました。私はさまざまな方法で物事を分割しようとしましたが、どれもうまくいきませんでした。
私はこれを見るのにとてもうんざりしているので、どんな助けもいただければ幸いです。