Animation auf den Bildschirm
Um eine Animation auf den Bildschirm zu bringen muss bei jedem Animationsschritt ein anderer Bereich der
Quellbitmap in den Zielbereich des Fensters kopiert werden. Wie das bei der im Bild oben ((??)) vorgegebenen
Bitmap aussehen könnte, zeigt das folgende Listing (auf der Heft-CD im Verzeichnis Quellen\Directx\DirectX2):
Sub DonutAnim(x As Long, _
y As Long, w As Long, _
h As Long, iAnim As Long)
Dim rDst As RECT
Dim rSrc As RECT
iAnim = iAnim Mod 60
'In jeder Zeile befinden
' sich 10 Animationssequenzen
rSrc.Left = (iAnim Mod 10) * _
(ddsd2.lWidth / 10)
'In der Anmiationsabbildung _
befinden sich 6 Zeilen
rSrc.Top = (iAnim \ 10) * _
(ddsd2.lHeight / 6)
rSrc.Right = rSrc.Left + _
(ddsd2.lWidth / 10)
rSrc.Bottom = rSrc.Top + _
(ddsd2.lHeight / 6)
Call dx.GetWindowRect _
(Picture1.hWnd, rDst)
'Dimension der PictureBox holen
rDst.Left = rDst.Left + x
rDst.Top = rDst.Top + y
rDst.Right = rDst.Left + w
rDst.Bottom = rDst.Top + h
primarySurface.Blt rDst, _
offscreenSurface, rSrc, DDBLT_WAIT
End Sub
Welche Sequenz der Animation angezeigt werden soll, bestimmt in der obigen Funktion der Parameter iAnim.
Die Parameter x,y, w und h legen die Position fest, an der die Ausgabe des Objektes erfolgen soll.
Innerhalb der Funktion wird zunächst der Parameter iAnim durch eine Division mit Rest (Modulo) auf den Wertebereich von 0 bis 59,
also insgesamt 60 Animationsstufen begrenzt. Anhand dieses Wertes wird anschließend die Position des Quellrechtecks berechnet.
Stellt man sich die Grafik wie ein Schachbrettmuster aus 10 x 6 Feldern vor, berechnet die Formel iAnim Mod 10 die
Spalte innerhalb des Schachbretts, während iAnim \ 10 (Division ohne Rest!) die Zeile im Schachbrett ermittelt.
Diese beiden Koordinaten müssen noch mit der Höhe und Breite eines jeden Sequenzfelder multipliziert werden.
Diese werden ganz einfach über ddsd2.lWidth / 10 und ddsd2.lHeight / 6 berechnet. Zur Erinnerung:
In ddsd2 stehen Gesamthöhe und Gesamtbreite der geladenen Grafik. Für anders aufgebaute Sequenzgrafiken
müssen die Wert 10 und 6 angepasst werden.
Auch die Berechnung des Zielrechtecks ist nicht völlig unproblematisch. Zur Erinnerung: Das Primary-Surface deckt
stets den gesamten Bildschirm ab. Das bedeutet, dass die Ausgabe eines Objektes an Position 0, 0 immer die linke
obere Ecke des Bildschirms beschrieben wird. Soll dagegen die linke obere Ecke des Ausgabefensters als Bezugspunkt
verwendet werden, muss deren absolute Bildschirmposition zunächst ermittelt und als Offset
für die Ausgabe eingesetzt werden. Erst dann wandert die Animation mit, wenn der Anwender das Fenster bewegt.
Um eine flüssige Animation zu erreichen, muss die oben dargestellte Funktion anschließend wiederholt aufgerufen werden.
Nur so sieht man auf dem Bildschirm eine Animation. In einem ersten Versuch wird dazu ein Timer-Control verwendet,
das beim Verstreichen des angegebenen Zeitintervalls (Intervall-Eigenschaft) die nächste Sequenz zeichnet. Aufgrund
der Beschränkungen des Timer-Controls lassen sich so jedoch maximal 50 Bilder pro Sekunde anzeigen. Später werden wir jedoch
eine Methode vorstellen, mit der die auf dem jeweiligen System mögliche Maximalgeschwindigkeit erreicht werden kann.
Ein nicht transparenter Donut auf dem Hintergrund.
Transparente Bilder
Zunächst widmen wir uns einem anderen Thema: der Perfektionierung der Ausgabe. Bisher wird die Grafik so wie sie ist
auf den Bildschirm platziert. Im aktuellen Zeichenmodus überschreibt die neue Grafik alle bisher sichtbaren Pixel.
Um das Programm etwas interessanter zu gestalten, wird eine einfache Hintergrundgrafik ausgegeben, auf der die Animationen
angezeigt werden. Weil bisher keine Transparenz definiert wurde, erscheint die Animation als schwarzes Rechteck mit eingebettetem Objekt.