C++ 正在向量数组中复制的字符串
编辑:更改标题以更好地反映当前问题 现在我知道问题的根源是谎言,它是与文本分割功能的一部分。我现在记得我所做的,我更改了拆分文本,因为我的教程返回了一个错误C++ 正在向量数组中复制的字符串,c++,text-rendering,C++,Text Rendering,编辑:更改标题以更好地反映当前问题 现在我知道问题的根源是谎言,它是与文本分割功能的一部分。我现在记得我所做的,我更改了拆分文本,因为我的教程返回了一个错误 for(const char *c=text;*c;c++) { if(*c=='\n') { string line; for(const char *n=start_line;n<c;n++) line.append(1,*n); lines.push_back(line)
for(const char *c=text;*c;c++)
{
if(*c=='\n') {
string line;
for(const char *n=start_line;n<c;n++) line.append(1,*n);
lines.push_back(line);
start_line=c+1;
}
}
if(start_line)
{
string line;
for(const char *n=start_line; n < c;n++) line.append(1,*n);
lines.push_back(line);
}
但如果知道我出了问题,那还是很好的*注意:上面的代码现在可以正常工作了,这和倍增效应没有问题。所以我确信这是我的文本分割代码 看起来那张截图中错误绘制的文本是“50b”,我怀疑这是一个正常出现在游戏中的字符串。看起来你画的东西通常是一个空字符串,但有时会拾取垃圾值——换句话说,就是未定义的行为
当然,我不能确定,因为我没有足够的信息来发现你的问题。我觉得你的glClear很好,所以你可以确信额外的文本是在与预期文本相同的框架中绘制的。这里有一个想法:在文本渲染方法中,添加一个静态计数器,并使用它设置渲染的每个字符串的颜色。由于每帧似乎没有那么多字符串,因此可以使用一个颜色分量(例如红色)的8位作为计数器,并将其他两个分量设置为255。如果您有255个以上的字符串,您仍然可以在2或3个颜色分量上对计数器值进行编码
有了这个小小的调试帮助,您将能够看到每段文本的呈现顺序。您可以使用和/或“实时”查看像素值。否则,只需截图并检查结果。图像非常小-老实说,我看不出问题:/只是一句话:你确定不使用深度缓冲区吗?@cli\u hlt你可以通过右键单击->查看图像(或复制图像位置并将url粘贴到你选择的窗口或选项卡中)以完全分辨率查看图像@01d55哦,多亏了你-我真傻。因此,我同意你的答案——这似乎是我们掌握的信息的最佳猜测+1到目前为止,我还尝试清除深度缓冲区,取消深度任务。但是我在我的代码中没有使用任何与深度函数相关的东西,事实上,它唯一使用的时间是在禁用深度测试的字体渲染中。移除对结果没有影响:/n也没有解除深度掩码或清除深度缓冲区。这是一个相当奇怪的问题…哦,我的错,50b应该在那里。它是“%ib”,int.啊,所以
(“%ikw”,int)
被打印了两次,第二次是在屏幕的一部分上,它不应该被吸引到。在//绘制文本之后会出现什么样的逻辑?是&否,在代码中,我个人不会打印代码两次。但出于某种原因,它确实如此。这是全部印刷品;但从逻辑上讲,这只是一个通用的C++代码,混合了一点点SDL,用于输入和定时器。它是一个计时器,当特定计时器到达第二个值时,更新第一个值。它将int的值加上20,并停止计时器。然后在下一个循环中重新开始。但是,是的,它几乎与openGL分离,用于所有渲染基础,SDL用于输入和基于计时器的功能。
for(const char *c=text;*c;c++)
{
if(*c=='\n')
{
string line;
for(const char *n=start_line;n<c;n++) line.append(1,*n);
lines.push_back(line);
start_line=c+1;
if(start_line)
{
string line;
for(const char *n=start_line;n<c;n++) line.append(1,*n);
lines.push_back(line);
}
}
else if (*c == *start_line)
{
lines.push_back(text);
}
}
for(const char *c=text;*c;c++)
{
lines.push_back(text);
break;
}