gpt4 book ai didi

c++ - 使用 Libtcod,如何控制 -> 打印具有动态颜色量的字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:50 26 4
gpt4 key购买 nike

我有一个辅助函数,它接受一个字符串和一个用于格式化字符串的颜色 vector ,现在我的解决方案是手动检查颜色 vector 的大小,并使用相同数量的颜色调用控制台打印颜色。

假设我有一个 4 的颜色 vector ,在代码中它会做类似的事情:

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 种颜色等。

我尝试为 vector 中的每种颜色执行 sprintf,将其添加到 out_string 并重复。我试过用 ostringstream 做同样的事情。我试过在 "%c" 上拆分 msg_str,然后在我为每个字符串添加颜色后加入结果字符串。它从来没有成功过,总是要么使用第一种颜色,然后使用随机字符而不是从那里开始的颜色。

我希望以上任何一个都能工作,因为简单的 sprintf(out_char, format_msg, TCOD_COLCTRL_1) 打印到控制台(使用 console->print(out_char) ) 就好了。

我的问题是:是否有一种好方法可以将不同数量的颜色传递给控制台 -> 打印功能并使其准确显示这些颜色,而无需严重的代码冗余?


作为回退,我可以打印出字符串的一部分直到第一种颜色,计算它的大小,将 x 移动那么多并打印下一部分,但这并不理想。

我想这个问题可以概括为询问关于常规 printf 的相同问题也有替换。

最佳答案

可变参数函数的一个可能替代方案可能涉及为“%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++;
}
}

我想我应该提一下,我的代码有问题。第二个 print 语句中的 x 值需要每次通过 while 循环计算,因为 x 作为 pos2 的函数变化。否则,一切都只会在同一个地方打印。 :) 应该是一个简单的改变...

关于c++ - 使用 Libtcod,如何控制 -> 打印具有动态颜色量的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23162382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com