Daten aus String löschen
-
int position = keyOut.find("_"); while (position != string::npos) { keyOut.replace(position, 1, ""); position = keyOut.find( " ", position + 1 ); }so also an sich sollte er doch jetzt die schleife solange durchlaufen bis er das zeichen nicht mehr findet oder? Weil irgendwie klappt das nicht. der macht das immer nur einmal
-
wie waer' denn sowas?
if(keyOut[x] == '\n') { glTranslatef(-summeDerCharsDieserZeile, ZeilenAbstand, 0); }
-
das war meine erste Variante
if (keyOut[x] == '\n') { int y = 0; y = (chars*curLine)-keyOut.size(); glTranslatef(-(y*charSize.X),-charSize.Y,0); }Das dumme hierdran ist, dass er jedes mal, wenn er rendert (tut er dauerhast) an der Stelle, wo er ein "\n" findet, die if-Abfrage ausführt. Sprich er verzieht alles und geht gar nicht.
Wie gesagt der einzige Code der das echt richtig anzeigt und alles klappt bis auf das löschen istif (keyOut[x] == '\n') { keyOut[x] = '_'; for(int a=keyOut.size(); a<(chars*curLine); a++) { keyOut += '_'; } }
-
Sprich er verzieht alles und geht gar nicht
und was bedeutet das konkret?
-
er zeichnet normalerweise wenn alles richtig läuft jede einzelne taste auf die weise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 usw.wenn ich jetzt mit meiner bisherrigen variante mache, dann setzt er zum Beispiel bei 6 einen umbruch und füllt bis 9 alle mit Leerzeichen, sodass er wieder in der neuen ist.
bei der anderen variante, sieht es ungefähr so aus
1. 1 2 3 4 5 6(Umbruch) 2. 789101112 3. 131415161718192021222324 4. 252627282930313233343536also mit jeder taste, die hinzukommt, rückt er die zweite und die 3 dritte zeile einen nach links und jetzt an die letzte zeile die neue taste dran.
mir ist außerdem aufgefallen, das er dieses prinzip die ganze zeit ausfürht jedoch schreibt er in die zweite zeile nur so viele zeichen, wie bei der ersten fehlen und bei den anderen macht er wieder die max. anzahl.
aber das verrücken macht er die ganze zeit
-
jedoch schreibt er in die zweite zeile nur so viele zeichen, wie bei der ersten fehlen
weil dann das hier greift:
//Wenn eine Reihe voll ist, sprich 40 Zeichen, dann mache automatisch einen Umbruch if(x == chars*curLine) { curLine++; glTranslatef(-size.X,-charSize.Y,0); }du brauchst also einen zaehler der die anzahl der zeichen der aktuellen zeile enthaelt.
also mit jeder taste, die hinzukommt, rückt er die zweite und die 3 dritte zeile einen nach links und jetzt an die letzte zeile die neue taste dran.
zaehlst du evtl das '\n'-zeichen mit?
-
zu 1. okay werde ich mal gucken was man da machen kann
zu 2. ich gehe mal von aus das er das tut, weil er den string ja immer wieder durchlaufen muss, und sobald er auf ein \n trifft, führt er die if-abfrage aus.
Wenn ich jetzt wie schon bei meinem anderen Versuch den Umbruch zum Beispiel zu einem Leerzeichen mache, dann macht er gar nichts erst, weil er beim 2. rendern die restlichen auffüllt
-
ich gehe mal von aus das er das tut
wuerdest du den debugger benutzen, waerst du sicher...
vorschlag:
void draw(char *text) { while (*text) { glPushMatrix(); // eine zeile schreiben (maximal "maximum" zeichen) for (int chars= 0; chars<maximum; chars++) { if (*text=='\n' || *text==0) // zeile zuende wenn zeilenumbruch oder textende break; drawchar(*text); // zeichen zeichnen glTranslatef(zeichenAbstand, 0.0, 0.0); // zum naechsten zeichen text++; } glPopMatrix(); // zurueck zum zeilenanfang glTranslatef(0.0, zeilenAbstand, 0.0); // naechste zeile } }
-
also die variante klappt auch nicht
aber ich hatte eine gute idea die klappen dürfteeine weitere frage habe ich noch:
wie kann ich das letzte zeichen einen strings ermitteln?
-
mit strlen(...)-1, wobei du checken solltest ob strlen >0 liefert.
-
Du solltest dich nochmal ein bisschen mit den Grundlagen beschaeftigen, wenn du solche einfachen Sachen nicht hinbekommst. Das ist echt einfachste Arbeit mit Pointern/ Arrays. Sowas kann man auch alles in Konsolenprogrammen testen. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)