www.jb-electronics.de » Programmieren » Doublebuffering
Eine der wohl am häufigsten gestellten Fragen im Zusammenhang mit Grafik lautet: Wie kann ich Grafiken flimmerfrei bewegen? Dieser Artikel soll eine Antwort darauf bieten, wie man unter QuickBASIC Grafiken flüssig und flimmerfrei bewegen kann.
Eins vorweg: Viele Wege führen nach Rom. Hier ist nur eine Methode von vielen vorgestellt. Das Schlüsselwort heißt Doublebuffering.
Wodurch entsteht eigentlich das Flimmern? Es entsteht dadurch, dass das menschliche Auge mitbekommt, wie der Gegenstand auf dem Bildschirm gezeichnet wird. Die ideale Lösung wäre also, den Gegenstand im Hintergrund zu zeichnen, und ihn dann - einmal fertig gestellt - auf den Bildschirm zu zaubern. Was wir also benötigen ist ein Puffer, in dem alle Grafiken gezeichnet werden, bevor sie auf den Bildschirmn gebracht werden.
Die Lösung ist auch schon im Namen Doublebuffering erkennbar: Buffer ist englisch und bedeutet nichts anderes als Puffer. Schön und gut, jetzt haben wir die Theorie, aber wie sieht es in der Praxis aus?
Viele Grafikmodi von QuickBASIC bieten nur eine Bildschirmseite an. Die einzigen Modi mit halbwegs zufriedenstellenden Auflösungen sind der Modus 7 (mit 320x200 Auflösung, 16 Farben und sage und schreibe 7 Bildschirmseiten) und der Modus 9 (mit 640x350 Auflösung, 16 Farben und zwei Bildschirmseiten). Wir entscheiden uns in unserem Beispiel für den Modus 7.
Um zwei Bildschirmseiten zu verwenden, müssen diese bei der Initialisierung des Bimdschirmmodus eingebunden werden. Das geschieht so:
SCREEN 7, , 0, 1
Damit setzen wir die Auflösung auf 320x200 mit 16 Farben; die sichtbare Bildschirmseite ist die Nummer 1, die unsichtbare Bildschirmseite ist die Nummer 0. Wenn nun Grafiken gezeichnet werden, werden diese auf die (unsichtbare) Bildschirmseite 0 gezeichnet. Die Bildschirmseite 0 ist also in diesem Fall unser Puffer. Um die Grafiken nun sichtbar zu machen, müssen wir den Inhalt der Bildschirmseite 0 lediglich in die Bildschirmseite 1 kopieren. Das geschieht mit folgendem Befehl:
PCOPY 0, 1
Danach sollte noch der alte Inhalt der Bildschirmseite 0 gelöscht werden, das geschieht wie gewohnt mit:
CLS
Hier nun ein vollständiges Programm, das einen Ball Ping-Pong-artig über den Bildschirm hüpfen lässt:
' Bildschirm initialisieren (320x200)
SCREEN 7, , 0, 1
' Variablen deklarieren
DIM PositionX AS INTEGER, PositionY AS INTEGER
DIM SpeedX AS INTEGER, SpeedY AS INTEGER
DIM Radius AS INTEGER
DIM Pause AS INTEGER
' Startwerte setzen
PositionX = 160
PositionY = 100
SpeedX = 3
SpeedY = 2
Radius = 10
' Jetzt geht's los:
DO
' weißer Kreis mit variablen Radius an Position (PositionX|PositionY)
CIRCLE(PositionX, PositionY), Radius, 15
' Ball bewegen
PositionX = PositionX + SpeedX
PositionY = PositionY + SpeedY
' Ball außerhalb des Bildschirms?
IF (PositionX <= Radius) OR (PositionX >= 320 - Radius) THEN SpeedX = -SpeedX
IF (PositionY <= Radius) OR (PositionY >= 200 - Radius) THEN SpeedY = -SpeedY
' In Primärpuffer kopieren und Bildschirm löschen
PCOPY 0, 1
CLS
' kleine Pause (Wert eventuell anpassen)
FOR Pause = 1 TO 3 STEP 1
WAIT &H3DA, 8
WAIT &H3DA, 8, 8
NEXT Pause
' Schleife bei Tastendruck verlassen
LOOP UNTIL LEN(INKEY$)
END
Der Quellcode sollte an sich relativ verständlich sein. Das einzig Wichtige ist jedoch, dass man sich die Reihenfolge merkt: Grafiken zeichnen, dann sichtbar werden lassen, dann den Puffer löschen.
Fast alle Spiele in QuickBASIC basieren auf diesem Verfahren. Auch in modernen Spielen funktioniert der Grafikaufbau nach diesem Prinzip.
www.jb-electronics.de » Programming » Double Buffering
There is no English translation of this page available yet. It will take some more time for me to translate the whole website.
If you have a particular interest in this page getting translated as fast as possible, please contact me; I will see what I can do. Please click here for the German version.