У меня есть вспомогательная функция, которая принимает строку и вектор цветов для форматирования строки, и прямо сейчас мое решение состоит в том, чтобы вручную проверить размер цветового вектора и вызвать печать консоли с тем же количеством цветов.
Скажем, у меня есть вектор цвета 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
с заменами.
mylist[1]
. В моем случае это было бы больше похоже наmylist[16]
. Похоже, это поможет, но я не уверен, что я ошибаюсь. Комментарии здесь не способ спросить об этом, я полагаю. stackoverflow.com/a/9277814/541208 - person TankorSmash   schedule 19.04.2014