Hilfe !!! system("cls");



  • Hallo Leute !
    Habe ein Consolenspiel geschrieben die ein Laberynt aus einer Datei ladet.
    Mann kann mit 'w','a','d' und 's' ein symbol dürch Laberynt bewegen. Mein Problemm ist das mit system("cls") es alles rückelt. Gibt es möglichkeiten consolenbild löschen mit boost oder per std:: ???
    Danke .



  • runix81 schrieb:

    Laberynt



  • runix81 schrieb:

    Gibt es möglichkeiten consolenbild löschen mit boost oder per std:: ???

    No. Vielleicht ist http://www.c-plusplus.net/code/ic/ was für Dich.



  • Du kannst auch dutzende newlines reinhauen.

    Oder das std::system ifdefen. Für Linux/BSD/Mac ist es std::system("clear") und für Windows ein std::system("cls").
    Für andere Plattformen muss du dir was spezielles raussuchen.



  • Mentras schrieb:

    Du kannst auch dutzende newlines reinhauen.
    Oder das std::system ifdefen. Für Linux/BSD/Mac ist es std::system("clear") und für Windows ein std::system("cls").
    Für andere Plattformen muss du dir was spezielles raussuchen.

    Er benutzt doch schon system("cls"). Und das Problem ist, daß das Laberynt so ruckelt, was ich mal als Flackern interpretiert habe.



  • Stimmt, habe nicht genau aufgepasst. 😮



  • volkard schrieb:

    Und das Problem ist, daß das Laberynt so ruckelt

    Nein, es rückelt. Du musst schon richtig lesen.



  • Unter windows könntest du mit der winapi den konsolencursor wieder an den anfang setzen und alles überschreiben, das ist zwar auch nicht perfekt sollte aber schon besser aussehen. geht bestimmt auch unter unix, aber da hab ich leider keine ahnung von 😞



  • Was du suchst ist vielleicht Double Buffering, damit ist flimmern (imo Fachwort) afaik ausgeschlossen.
    Für 'ne Dos-Konsole gibts das afaik garnicht. Bisher ist fast jeder, der genau das versuchen wollte, kläglich gescheitert. Du musst dir schon was anderes holen.
    Und volkard, gehört das nicht in ein anderes Forum ?



  • Klar kann man auch auf der Konsole doppelpuffern - du schreibst halt was auch immer du ausgeben willst nicht direkt auf die Konsole, sondern erst in einen Puffer, den du ausgibst, sobald er fertig ist. Es kann aber der beste Puffer Flackern nicht verhindern, wenn man, bevor man ihn zeichnet, den Bildschirm übermalt. Page-Flipping wird in der Konsole nicht funktionieren, ist aber mit einiger Wahrscheinlichkeit auch nicht notwendig.

    Ohne das jetzt getestet zu haben (grad kein Windows zur Hand): Du suchst wahrscheinlich nach SetConsoleCursorPosition. Das liest sich dann wie folgt:

    COORD top_left = { 0, 0 };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), top_left);
    

    ...um wieder nach links oben zu gehen. Wenn du das statt system("cls") benutzt, dürfte das Problem verschwinden. Damit das funktioniert, muss <windows.h> eingebunden werden.



  • seldon schrieb:

    Klar kann man auch auf der Konsole doppelpuffern - du schreibst halt was auch immer du ausgeben willst nicht direkt auf die Konsole, sondern erst in einen Puffer, den du ausgibst, sobald er fertig ist. Es kann aber der beste Puffer Flackern nicht verhindern, wenn man, bevor man ihn zeichnet, den Bildschirm übermalt.

    Ich muss mich anders ausdrücken:
    Ich meinte nicht double buffering, sondern das Flimmern.
    Das wirst du in einer Konsole nicht unterdrücken können.



  • Aber selbstverständlich kann man das. Ich erinnere mich noch, wie wir zu DOS-Zeiten über LANtastic Konsolenspiele gezockt haben, die kein bisschen flimmerten.

    Du darfst halt nur die Konsole zwischendurch nicht dazu zwingen, sich selbst zu löschen, bevor du das Labyrinth neu malst. Das Flackern kommt ja dadurch zustande, dass die Zeichen des Labyrinths erst durch ein Leerzeichen und dann wieder durch das selbe Zeichen übermalt werden. Wenn du den Zwischenschritt rauslässt und das Labyrinth-Zeichen mit einem identischen Zeichen übermalst, tritt kein Flacker-Effekt auf. Das ist auch die Idee hinter Double-Buffering: du malst erst das gesamte Labyrinth in einen Buffer, gehst dann ohne die Ausgabe zu löschen nach links oben und dumpst ihn auf einen Rutsch raus. Die einzigen Zeichen, die sich ändern, sind dann die, die im neuen Frame anders sind, und da ist das ja gewollt.



  • Hmm...Interessant. Wusst ich nicht, werds demnächst mal ausprobieren.


Log in to reply