2011-11-19 2 views
0

Редактировать: Изменено название, чтобы лучше отражать текущую проблему.Строка дублируется в векторном массиве

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

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

«с» возвращался необъявленная, и нет никакого упоминания любого другого с, так что я предполагаю, что это имеет в виду указатель в цикл выше. Хотя приведите «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); 
    } 
} 

Я уверен, что «иначе если (* в == * start_line)» сравнительное это то, что вызывает у меня вопрос. Не уверен, хотя что заменить его. Я думаю, хотя, потому что я не использую никаких новые строки или не планирую я могу просто пойти с:

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

Но все равно было бы неплохо бы знать, я собирался не так. * Примечание: что приведенный выше код работает отлично, нет проблемы с этим и эффекта удвоения. Поэтому я уверен, что это был мой код разделения текста.

+1

Изображение довольно маленькое - честно говоря, я не вижу проблемы:/Просто замечание: вы уверены, что не используете буфер глубины? –

+1

@cli_hlt Вы можете просматривать изображения при полном разрешении одним щелчком мыши -> просмотреть изображение (или скопировать местоположение изображения и вставить URL-адрес в окно или вкладку по вашему выбору). – 01d55

+0

@ 01d55 ой хорошо благодаря вам - немой мне. Поэтому я иду с вашим ответом - кажется, лучше всего угадать информацию, которую мы имеем. +1 –

ответ

1

Вот вам идея: в вашем методе рендеринга текста добавьте статический счетчик и используйте его для установки цвета каждой отображаемой строки. Поскольку у вас не так много строк на кадр, вы можете использовать 8 бит одного цветового компонента (например, красный) для счетчика и установить 2 других компонента на 255. Если у вас было более 255 строк, вы могли бы все еще кодируют значение счетчика более чем на 2 или 3 компонента цвета.

С помощью этой небольшой отладочной помощи вы сможете увидеть, в каком порядке визуализируется каждый фрагмент текста. Вы можете использовать pixie и/или zoomin, чтобы увидеть значения пикселей «вживую». В противном случае просто снимите скриншот и проверьте результат.

1

Похоже, что ошибочно нарисованный текст в этом захвате «50b», который, я сомневаюсь, является строкой, которая обычно появляется в вашей игре. Похоже, вы рисуете что-то, что обычно является пустой строкой, но иногда подбирает ненужные значения - другими словами, неопределенное поведение.

Я не могу быть уверен, конечно, потому что у меня просто недостаточно информации, чтобы найти вашу проблему. Ваш glClear выглядит хорошо для меня, поэтому вы можете быть уверены, что дополнительный текст рисуется в том же фрейме, что и предполагаемый текст.

+0

О, моя вина, 50b на самом деле должна быть там. это «% ib», int. – Danran

+0

Ах, поэтому '("% ikw ", int)' был напечатан дважды, а второй раз на части экрана его не нужно рисовать. Какая логика появляется после '// Draw the Text'? – 01d55

+0

Ну да и нет, в коде я лично не печатаю код дважды. Но почему-то это происходит. Вот печать в полном объеме; http://pastebin.com/cs2QadC2 Но с точки зрения логики, после этого все это просто общий код C++, смешанный с небольшим количеством SDL для ввода и таймеров. Это таймер, который обновляет это первое значение, когда этот конкретный таймер достигает прикомандированного. Он добавляет 20 к значению int и останавливает таймер. Затем он снова запускается в следующем цикле. Но да, он очень сильно разделен с openGL для всей базы рендеринга и SDL для ввода и таймера. – Danran

Смежные вопросы