Используя Libtcod, как утешить & gt; напечатать строку с динамическим количеством цветов?

У меня есть вспомогательная функция, которая принимает строку и вектор цветов, чтобы использовать ее для форматирования строки, и сейчас мое решение состоит в том, чтобы вручную проверить размер цветового вектора и вызвать печать консоли с тем же количеством цветов.

Скажем, у меня есть цветовой вектор 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 с заменами тоже.

2

Решение

Одна из возможных альтернатив функциям с переменными параметрами может включать синтаксический анализ msg_str для «% c» и итеративную печать каждого сегмента строки в правильном цвете в соответствии с 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++;
}
}

Я думал, что должен упомянуть, есть проблема в моем коде. Икс значение во втором операторе печати нужно вычислять каждый раз через цикл while, так как Икс меняется как функция pos2. В противном случае все будет продолжать печатать в одном месте. 🙂 Должно быть легкое изменение …

2

Другие решения


По вопросам рекламы [email protected]