Die Methode RestoreAllSurfaces aufgerufen
Um die Surfaces zu restaurieren, muss einzig die Methode RestoreAllSurfaces des DirectDraw-Objektes aufgerufen
werden. Sie sorgt automatisch dafür, dass alle Surfaces eines Anwendung erneut ihren Speicher reklamieren. Das Laden
der Bilder in die Offscreen-Surfaces muss erneut durchgeführt werden. Allerdings nur dann, wenn die Methode IsLost
anzeigt, dass der Inhalt der Bilder-Surfaces tatsächlich verlorengegangen ist. Doch nicht nur bei der Initialisierung
und während des Betriebs, auch zum Schluss einer Vollbildanwendung müssen besondere Vorkehrungen getroffen werden.
Damit der Windows-Desktop nach Beendigung der DirectDraw-Anwendung wieder im alten Glanz erstrahlt, muss die
Methode FlipToGDISurface gefolgt von RestoreDisplayMode aufgerufen werden, die den Darstellungsmodus
vor dem Aufruf von SetDisplayMode wiederherstellt. Außerdem muss die Kooperationsstufe wieder auf Normal
zurückgesetzt werden, damit
Windows wie gewohnt auf den Bildschirm zugreifen kann:
dd.FlipToGDISurface
dd.RestoreDisplayMode
dd.SetCooperativeLevel _
Form1.hwnd, DDSCL_NORMAL
|
Draw-Primitives
Ein DirectDrawSurface-Objekt lässt sich nicht nur über Blt-Befehle bearbeiten. Ein Surface bietet vielmehr
eine Reihe von Funktionen, mit denen in ein Surface "hineingemalt" werden kann. Neben nahezu selbsterklärenden Methoden
wie DrawBox, DrawLine oder DrawEllipse bietet das Objekt auch die Methode DrawText, mit der sich ein
Text in das Surface ausgeben lässt. Die Farbe und der Füllmodus, in der die Ausgabe erfolgt, wird über Methoden
wie SetDrawWidth, SetFillColor und dergleichen bestimmt. Die Schriftart, in der Zeichen ausgegeben werden,
wird über einen Aufruf der SetFont-Methode bestimmt, der ein Font-Objekt mit den Schriftartinformationen übergeben wird.
Damit existieren Möglichkeiten zur Bearbeitung eines Surfaces, die man in dieser Form nicht einmal von einer PictureBox her kennt
und die gewiss einen genaueren Blick Wert sind.
|
Bitte Musik, DirectSound!
Ohne Sound ist ein Spiel nur die Hälfte Wert. Daher beschäftigen sich die Methoden der DirectSound-Schnittstelle mit dem
Abspielen von Sounds. Doch im Gegensatz zu den herkömmlichen Multimedia-Funktionen von Windows handelt es sich bei DirectSound
um eine Low-Latency-Schnittstelle. Das heißt, dass das Abspielen eines Sounds nahezu ohne Verzögerung stattfindet - denn
was würde es nutzen, wenn der Knall einer Explosion erst einige Sekunden nach Anzeige derselben zu hören ist? Außerdem können
mehrere Sounds parallel abgespielt werden. Wenn zahlreiche Explosionen stattfinden, muss nicht auf das Ende der letzten Explosion
gewartet werden, bis die nächste startet. Zum gleichzeitigen Abspielen mehrerer Sounds stützt sich DirectSound entweder auf die
Soundkartenhardware, die über eine Reihe separater Soundgeneratoren verfügt, oder DirectSound emuliert fehlende Soundhardware durch
Rückgriff auf die CPU, von der Taktzyklen zum Einmischen und Abspielen der Sounds herangezogen werden. Ausgangspunkt der eigenen
DirectSound-Anwendung ist wiederum das DirectX7-Object, über das durch einen Aufruf von CreateDirectSoundein neues
DirectSound-Objekt erzeugt wird:
Dim dx As New DirectX7
Dim ds As DirectSound
Set ds = dx. _
DirectSoundCreate("")
Anschließend wird die Kooperationsstufe von DirectSound eingestellt. Denn im Gegensatz zu DirectDraw, das problemlos
mehrere Fenster auf dem
Desktop verwalten kann, ist es kaum möglich, mehreren Anwendungen das Abspielen ihrer Sounds
ohne eine hörbare Kakophonie zu gewähren. Daher kann das DirectSound-Objekt ähnlich wie das DirectDraw-Objekt mit einem
Fenster verknüpft werden. Nur wenn das Fenster den Eingabefokus besitzt, wird der Sound tatsächlich ausgegeben. Um die
Soundausgabe mit dem Eingabefokus des Fensters zu verknüpfen, muss neben dem Handle des entsprechenden Fensters außerdem
das Flag DSSCL_PRIORITY übergeben werden:
ds.SetCooperativeLevel _
Me.hWnd, DSSCL_PRIORITY