2

問題については、下の最初の画像を参照してください。テキストの 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 文字未満の場合にのみ適切に機能します。

ここに画像の説明を入力

4

1 に答える 1

1

配列の長さが定義されているため、プログラムがクラッシュします。newmsg適切にサイズ変更

また、それを確認してくださいstartpos + i >= 0 && < length of array...


2番目の質問について:

あなたが言ったように:

テキストで色を使用すると、文字列がカラー コードごとに 2 文字ずつ右にシフトします。

カラーコードを含むメッセージの長さを考慮しているため、印刷前にカラーコードが削除されているようで、問題が発生します...

もしそうなら、私はこれにどのようにアプローチしますか?

msgたとえば、カラーコードごとに2つ少ないスペースを追加するかもしれません。

于 2013-11-20T13:50:36.267 に答える