Yahoo Clever wird am 4. Mai 2021 (Eastern Time, Zeitzone US-Ostküste) eingestellt. Ab dem 20. April 2021 (Eastern Time) ist die Website von Yahoo Clever nur noch im reinen Lesemodus verfügbar. Andere Yahoo Produkte oder Dienste oder Ihr Yahoo Account sind von diesen Änderungen nicht betroffen. Auf dieser Hilfeseite finden Sie weitere Informationen zur Einstellung von Yahoo Clever und dazu, wie Sie Ihre Daten herunterladen.

C++ Bildschirminhalt überschreiben?

Ich möchte in einer C++ Application (kein WinGUI) den Bildschirminhalt überschreiben bzw. löschen, dies soll aber nicht mit system ("cls") realisiert werden, da der Vorgang oft wiederholt werden muss. cls flackert dann.

Beispiel: Es soll eine simple 2D-Landschaft aus ASCII-Zeichen ausgegeben werden in der der Spieler (repräsentiert durch ein #) z.B. durch drücken der linken Pfeiltaste ein Feld nach links gehen soll.

Ich habe schon überlegt ob es vielleicht möglich ist das ganze Bild neu auszugeben und dann Scrollen zu Verbieten. Ein anderer Gedanke war den Spieler als Variable darzustellen und dann ein Bild immer wieder zu aktualisieren. Bin aber zu keiner Lösung gekommen und brauche jetzt Hilfe.

3 Antworten

Bewertung
  • MeMeMe
    Lv 7
    vor 1 Jahrzehnt
    Beste Antwort

    Es gibt in C++ keinen eingebauten Weg um so etwas zu realisieren, da C++ auf C aufbaut und das Ein- und Ausgabemodell von C wurde nicht für Bildschirme sondern für Teleprinter entwickelt (war halt in den 70er Jahren üblich, Minirechner mit Unix über solche Teleprinter zu steuern).

    Um einen Text-Modus-Bildschirm zu verwenden, wie er auf PCs früher üblich war und auch heute noch möglich ist gibt es keinen Weg vorbei an der Verwendung eines plattformspezifischen Weges. Das wäre

    - wenn du DOS (nicht Win32 Konsolenapplikation!!!) verwendest, entweder die direkte Manipulation des Videospeichers im Segment B800h oder die Conio-Bibliothek (die normalerweise genau das macht).

    - unter Windows die Win32 Console API

    - unter Unix-basierten Betriebssystemen entweder die Verwendung der ANSI-Escape-Sequenzen (kompliziert) oder die curses-Bibliothek.

    Es gibt auch Implementierungen der curses Bibliothek für DOS und Windows, wenn du planst dein Programm auf andere Betriebssysteme zu portieren wäre das der beste Weg. Für Windows-Konsolenprogramme würde ich zur Verwendung der Console API raten. Informationen dazu findest du (leider auf Englisch) in der MSDN-Bibliothek:

    http://msdn.microsoft.com/en-us/library/ms682010%2...

    system("cls") ist übrigens ein denkbar schlechter Weg, denn dann startet dein Programm eine neue Kommandozeile, die den Befehl CLS ausführt und dann wieder beendet wird. Das ist also DEUTLICH zeitaufwändiger, als wenn du deinen Bildschirm direkt mit den passenden APIs löscht.

  • vor 1 Jahrzehnt

    wenn du intensiv mit der konsole arbeitest, koennte die curses library hilfreich fuer dich sein:

    http://en.wikipedia.org/wiki/Curses_%28programming...

    eigentlich ist das ais dem Unix bereich, aber es gibt auch ne windowsvariante:

    http://pdcurses.sourceforge.net/

    hab es selber noch nicht benutzt, aber zumindest die Linux library ncurses wird oft benutzt (schon weil unter Linux das terminal eine groessere rolle spielt.)

  • vor 1 Jahrzehnt

    Das Flattern ist ein Problem das sich immer bei der Löschung des Bildschirms ergibt. Reduzieren läßt sich das nur wenn die Zeit möglichst weit reduziert wird i der der Bildschirm schwarz ist. Bei früheren windowes (GUI) Versionen gab es eine WM_ERASEBKGND Message. Dort gab es immer wieder das gleiche Problem http://msdn.microsoft.com/en-us/library/ms648055(v... Aus diesem Grund wirde die Nachricht auch nicht mehr benutzt.

    Mach es genauso. Also schreib den Bildschirminhalt in ein Array so das ALLE Zeichen gesetzt sind einschliesslich der freien Flächen. Und schreib den gesamten Bilinhaltr dann als einen Block Positionsweise auf den Bildschirm.

    char a[maxx,maxy];

    // Hier das Array füllen;

    // ...

    // Ausgabe auf dem Bildschirm

    for(char x=0;i<maxx;x++) {

    for(char y=0;i<maxy;y++) {

    gotoxy(x,y);

    putc(a[x,y], stdout);

    }

    }

Haben Sie noch Fragen? Jetzt beantworten lassen.