Moinsen!
Ich programmiere seit Sommer 2003 mit Turbo-Pascal7.0.
Hab schon so\'n bissel mit Grafikprogrammierung gearbeitet.
Ich hab eine Hubschrauber programmiert, welcher sich mit ver-
schiedenen Tasten steuern lässt. Jedes Mal wenn ich ihn bewege,
wird das Bild (Hintergrundbild: brauner Boden und ein Baum) neu aufgebaut. Wenn ich die Steuerungstaste gedrückt halte, um schneller
zu fliegen, wird also bei jedem Signal das Bild ge\'ClearDevice\'t.
Dann entsteht ein Flimmern. Wie kann ich das verhindern????
Gruß KoRny Boy
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Hi!
Mit normalem zeichnen wird's schwierig. Ich weiss nicht, ob man im PC den zeilenrücklauf des Bildschirms abfragen kann und damit dann zeichnen kann, wenn der Monitor gerade das Bild nicht neu aufbaut (Bei TFTs sollte das dann nutzlos sein...).
Bliebe noch zwei Bildschirme zum Zeichnen einzusetzen und dann einfach nur umzuschalten (müsste nachschauen, ob das mit den normalen EGA/VGA-Modes geht).
Die letzte Möglichkeit: auf das Löschen vor dem Zeichnen verzichten. Kennen die Turbo-Pascal-Routinen die zeichnfarbe "Transparent"? Ich weiss es nicht udn müsste es erst ausprobieren.
Falls nicht, dann überschreibt der Hintertgrund doch gegebenfalls das zuvor gezeichnete Element, wenn man einen Recheckblock auf den Bildschirm kopiert. Zumindest bei einfachem Hintergrund müsste das klappen (es bleibt das Problem des Darüberzeuchnens anderer Elemente).
OK, ich hab' die TP-Bibel aus dem Regal gezogen "Borland Delphi 7.0 - das Buch":
Schau dir am besten die Befehle Get/SetVisualPage() und Set/GetActivePage() an und zusätzlich die Befehle Gert/SetImage(), falls du diese nicht verwendest.
Bis denn
Andreas
Danke, ich werds ausprobieren! Melde mich wieder, wenns geklappt hat bzw nicht funktioniert hat.
Gruß KoRny Boy
Hi Andi,
Ich komme mit SetActivePage(page) und SetVisualpage(page)nicht zurecht. Wenn ich einen Hintergrund habe der als
PROCEDURE Hintergrund;
BEGIN
[Bäume]
[Boden]
[Wolken]
END;
vereinbart ist, wie kann ich den denn als Aktive Seite einsetzen.
Folgendermaßen hab ich es versucht:
SetActivePage(Hintergrund);
Mir ist zwar klar, dass das nicht funktionieren kann, aber ne andere möglichkeit habe ich nicht gefunden. hab zwar auch n buch dazu aber das ist nich grad ausführlich über grafikprogrammierung.
Gruß KoRny Boy
Hi!
Ich war weg, deshalb dauert die Antwort:
Der Trick ist, mit zwei Bildschirmen zu arbeiten.
Dabei zwechnet man immer in die aktuell nicht angezeigte Seite.
ich hab' das nicht überprüft, aber es sollte ungefähr so funktionieren:
{Vorbereiten für zeichenen:}
setvisualpage(2)
setactivepage(1)
-> Ab jetzt wird Seite 2 angezeigt, aber auf Seite 1 gezeichnet.
Umschalten der Seite nach dem Zeichnen:
setvisualpage(1)
seactivepage(2)
Nun wird Seite 1 angezeigt und in Seite 2 gezeichnet.
Verständlich?
Bis denn
Andreas
Jo, aber ich hab nicht gecheckt, wie man den Hintergrund(Baum,Boden,Himmel) als "1" deklariert. Damit man den Hintergrund so aufruft:
SetVisualPage(1)
Kann sein, dass das bei dir Routine ist, aber ich bin Anfänger(14).
Gruß KoRny Boy
Hi!
Ich bin mir nicht sicher, ob wir von selben reden. ;-)
OK, ich denke du hast folgendes Problem:
- du zeichnest Baum, Boden und Himmel
- dann löschst du den Bildschirm komplett
- und fängst wieder Oben an (mit zeichnen)
-> Das flimmert, weil man sieht, wie der Bildschirm gelöscht wird.
OK, ich würde das mit der Verwendung von zwei Bildschirmseiten umgehen.
Angezeigt wird immer nur eine davon (sonst wär's auch witzlos).
Da man nun eine "unsichbare" Seite hat, sieht man das Löschen und Neuzeichnen nicht.
Wenn ich die "unsichtbare" Seite fertig gezeichnet habe, schalte ich um. Sie wird dann zur neuen Sichbaren und die bisher sichbare wird zur unsichbaren, auf der ich nun wieder löschen und neu zeichnen kann (ohne dass man das sieht).
Der Gag ist nun, dass wir den TP-Befehlen zum Löschen und Zeichnen nicht sagen müssen, in welche Seite sie das gefälligst tun sollen, mit SetActivePage() bestimmen wir einfach, welche Seite die Zeichenbefehle nutzen sollen.
Unabhängig davon, bestimmen wir mit SetVisualPage(), welche der Seiten angezeigt wird.
OK, probiers aus. Hier ist eine Rourtine die das nutzt. Ich schreibe jetzt kein komplettes Programm, ich werde das nochnichtmal mit TP compilieren, dass darfst du machen. ;-)
Es geht nur ums Prinzip, ok:
procedure zeichen.schleife;
var
sichtbar, unsichtbar, altunsichtbar:byte;
begin
{Init}
sichtbar := 1;
unsichbar := 2;
repeat
setactivepage(unsichtbar);
setvisualpage(sichbar);
{jetzt wird gezeichnet, die Prozedur musst du selbst schreiben}
zeichne.bbh;
{zeichnen ist fertig, also umschalten}
altunsichbar := unsichtbar;
unsichtbar := sichtbar;
sichtbar := altunsichtbar;
{das war's}
until keypressed
end;
In der Prozedur musst du jetzt noch deinen Boden, die Bäume und den Himmel zeichnen. Irgendwie musst du in diesem Beispiel dafür sorgen, dass dort ein Zähler (oder sowas) verwendet wird, damit sich das Bild, dass die Prozedur zeichnet etwas bewegt.
Bis denn
Andreas
Ok, danke erstmal. Bei Problemen melde ich mich wieder. kann vielleicht noch dauern - vielleicht auch nicht. Hoffe, dass du ab und zu hier noch ma reinschaust. Die nächste Meldung von mir kann vielleicht morgen oder auch erst in einer woche sein.
Gruß KoRny Boy