問題については、下の最初の画像を参照してください。テキストの 1 行目は正しく配置されていますが、2 行目は正しく配置されていません。
数か月前、ゲームサーバーの変更のためにテキストをコンソール上で適切に処理するために、テキストを文字列の中央に配置するコードを書きました。このコードは非常にうまく機能しますが、2 つの大きな問題があります。
実際のコンソールの 112 文字の制限を超えると、ゲームサーバーがクラッシュします (この問題は、通常のコンソール メッセージでは発生しません)。
テキストで色を使用すると、文字列がカラー コードごとに 2 文字ずつ右にシフトします。
私は 2 番目の問題を解決しようとしています (ただし、最初の問題を解決すると大きなメリットがあります) が、これを行う方法がわかりません。これはテキストに色を付けるために必要なため、単純に色分けを取り除くことはできません。
選択できる 9 つの色の種類がなければ、このコードは単純かもしれません。
*$1= White
*$2= Dark Blue
*$3= Green
*$4= Red
*$5= Yellow
*$6= Light Blue
*$7= Purple
*$8= Orange
*$9= Grey
場合によっては通常の文字として使用されるため、「$」も単純に探したくありません。
スペースを挿入するときに $1-$9 を無視することは可能ですか? もしそうなら、私はこれにどのようにアプローチしますか?
コード
int CScriptBind_GameRules::CentreTextForConsole(IFunctionHandler *pH, const char *msg)
{
if (msg)
{
const int linelength=200;
char newmsg[linelength+1];
for(int i=0;i<linelength;i++)
newmsg[i]=0;
for(int i=0;i<linelength;i++)
newmsg[i]=' ';
newmsg[linelength]=0;
int msglen=strlen(msg);
int startpos=4+linelength/2-msglen/2;
for(int i=msglen-1;i>=0;i--)
newmsg[startpos+i]=msg[i];
msg=0; //Null the message.
return pH->EndFunction(newmsg);
}
else
{
return pH->EndFunction();
}
例
仕事をしているため、現在開発用 PC にアクセスできません。この問題が解決されていない場合は、数時間後に戻ってきたときにスクリーンショットを投稿します。
Lua からの発信者:
Core.CenteredConsole:All(g_gameRules.game:CentreTextForConsole("$1Crysis$4Wars Infinity iX 5.0"));
これは、どのように見えるべきかを示しています。メッセージは、長さが 80 文字未満の場合にのみ適切に機能します。