【问题标题】:String being duplicated in vector array字符串在向量数组中重复
【发布时间】:2012-01-01 16:55:47
【问题描述】:

编辑:更改标题以更好地反映当前问题。

我现在知道问题的根源在于功能的文本拆分部分。我现在记得我做了什么,我更改了拆分文本,因为我的教程返回了一个错误。

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);
}

'c' 未声明返回,并且没有提及任何其他 c,所以我猜它指的是上面 for 循环中的指针。虽然将“if (start_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);
        }
    }
    else if (*c == *start_line)
    {
        lines.push_back(text);
    }
}

我很确定“else if (*c == *start_line)”比较是导致我出现问题的原因。不确定用什么替换它。我想是因为我没有使用任何换行符或不打算使用:

for(const char *c=text;*c;c++) 
{
    lines.push_back(text);
    break;
}

但如果我错了,我还是很高兴知道。 *注意:上面的代码现在可以正常工作了,没有问题,而且效果加倍。所以我确定这是我的文本拆分代码。

【问题讨论】:

  • 图像很小 - 老实说,我看不到问题:/ 只是一个评论:你确定你不使用深度缓冲区吗?
  • @cli_hlt 您可以通过右键单击以全分辨率查看图像 -> 查看图像(或复制图像位置并将 URL 粘贴到您选择的窗口或选项卡中)。
  • @01d55 哦,多亏了你 - 我傻了。因此,我同意您的回答-似乎是对我们所拥有信息的最佳猜测。 +1
  • 到目前为止,我已经尝试过清除深度缓冲区,广告禁用 depthMask。但是我没有在我的代码中使用与任何深度函数相关的任何东西,事实上,它唯一一次使用的是字体渲染,它禁用了深度测试。并且删除它对结果没有影响:/也没有禁用深度蒙版或清除深度缓冲区。这是一个相当奇怪的问题......

标签: c++ text-rendering


【解决方案1】:

这里有一个想法:在你的文本渲染方法中,添加一个静态计数器并使用它来设置每个渲染字符串的颜色。由于每帧似乎没有那么多字符串,您可以使用一种颜色分量(例如红色)的 8 位作为计数器,并将其他 2 个分量设置为 255。如果字符串超过 255 个,则可以仍然使用 2 或 3 个颜色分量对计数器值进行编码。

借助这个小小的调试帮助,您将能够看到每段文本的呈现顺序。您可以使用pixie 和/或zoomin 来“实时”查看像素值。否则,只需截屏并检查结果。

【讨论】:

    【解决方案2】:

    看起来该捕获中错误绘制的文本是“50b”,我怀疑这是一个通常会出现在您的游戏中的字符串。看起来您正在绘制通常是空字符串的东西,但有时会拾取垃圾值 - 换句话说,未定义的行为。

    当然,我不能确定,因为我没有足够的信息来找出您的问题。您的 glClear 对我来说看起来不错,因此您可以放心,额外的文本是在与您的预期文本相同的框架中绘制的。

    【讨论】:

    • 哦,我的错,50b 实际上应该在那里。它是“%ib”,整数。
    • 啊,所以("%ikw", int) 被打印了两次,第二次出现在不应该被绘制到的屏幕上。 //Draw the Text之后出现什么样的逻辑?
    • 好吧,是与否,在代码中我不会亲自打印代码两次。但出于某种原因,它确实如此。这是完整的印刷品; pastebin.com/cs2QadC2 但就逻辑而言,在那之后,这一切都只是一般的 c++ 代码,混合了一些用于输入和计时器的 SDL。它是一个计时器,当特定计时器达到第二个值时,它会更新第一个值。它将 int 的值加 20,并停止计时器。然后在下一个循环中重新开始。但是,是的,它几乎与所有渲染基础的 openGL 和基于输入和计时器的功能的 SDL 分开。
    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2016-11-15
    相关资源
    最近更新 更多