2

文字列と文字列をフォーマットするために使用する色のベクトルを受け入れるヘルパー関数があります。現在、私の解決策は、色ベクトルのサイズを手動で確認し、同じ量の色でコンソール印刷を呼び出すことです。

4 のカラー ベクトルがあるとします。コードでは次のようになります。

void helper_func(TCODConsole* con, std::string msg_str, std::vector<TCOD_colctrl_t> color_vector)
{
  char* message = msg_str.c_str();
  //this is repeated 1 through 16, adding another color_vector.at(n) for each.
  ...
  else if (color_vector.size() == 2)
   //message might be "%cHello%c was in red"
   console->print(x, y, message, color_vector.at(0), color_vector.at(1))
  ...
  else if (color_vector.size() == 4)
   //message might be "%cThe octopus%c shimmers at %cnight%c"
   console->print(x, y, message, color_vector.at(0), color_vector.at(1), color_vector.at(2), color_vector.at(3))
  ...
}

これは機能しますが、ひどいので、16色以上を許可するなど、さまざまな方法でそれを実現することを検討していました.

sprintfベクター内の各色に対して、out_string に追加して繰り返してみました。私はostringstreamで同じことをしようとしました。msg_str を分割して、"%c"それぞれに色を追加したら、結果の文字列を結合しようとしました。常に最初の色を使用してから、色の代わりにランダムな文字を使用するかのいずれかで、うまくいきませんでした。

sprintf(out_char, format_msg, TCOD_COLCTRL_1)コンソールに出力するだけで(を使用して)問題なく動作するため、上記のいずれかが機能することを期待していましたconsole->print(out_char)

私の質問は次のとおりです:さまざまな数の色を console->print 機能に渡し、それらの色を正確に表示させる良い方法はありますか?


フォールバックとして、文字列の最初の色までのセクションを印刷し、そのサイズを計算し、その分だけ移動xして次のセクションを印刷することもできますが、これは理想的ではありません。

printfこの質問は、通常の置換についても同じことを尋ねることに一般化できると思います。

4

1 に答える 1

2

可変個引数関数に代わる 1 つの可能な方法は、"%c" の msg_str を解析し、文字列の各セグメントを color_vector に従って正しい色で繰り返し印刷することです。以下のコードがコンパイルされるかどうかはわかりません。メモ帳に書いたので、多少の作業が必要になる可能性があります。うまくいけば、私が提案していることの要点を理解していただけます。

void helper_func(TCODConsole* con, std::string msg_str, std::vector<TCOD_colctrl_t> color_vector) 
{
    std::string str2;
    std::size_t pos;
    std::size_t pos2;

    pos = msg_str.find("%c");
    if (pos != std::string::npos)
        str2 = msg_str.substr(0,pos);
    else
        str2 = msg_str;
    console->print(x, y, str2.c_str());
    int n = 0;
    while (pos != std::string::npos) {
        pos2 = msg_str.find("%c",pos+1);
        if (pos2 != std::string::npos)
          str2 = msg_str.substr(pos+2,pos2);
        else
          str2 = msg_str.substr(pos2+2,msg_str.length()-pos2+2);
        console->print(x, y, str2.c_str(),color_vector.at(n));
        pos = pos2;
        n++;
    }
}

コードに問題があります。xはpos2の関数として変化するため、2 番目の print ステートメントのx値は、while ループを実行するたびに計算する必要があります。そうしないと、すべてが同じ場所に印刷され続けます。:) 簡単に変更できるはずです...

于 2014-09-03T20:37:18.000 に答える