Surfaces aus und in den Bildschirm bewegen (scrollen)

 

Wie schon erwähnt verschwinden die Bitmaps, wenn man diese an solche eine Position blittet, dass sich ein Teil dieser ausserhalb des Bildschirmes befindet. D.h. eigentlich müsste man ja noch den Teil des Bitmaps sehen, der sich noch im Bildschirm befindet, aber nein! DirectDraw lässt alles verschwinden. Warum auch immer...

 

Wie man im obigen Bild sehen kann, ist ein Teil (der bläuliche) ausserhalb des Bildschirmes. Mit der normalen BltFast Methode, wie Ihr sie kennt würde das Bild ganz verschwinden (beim Blitten zum Backbuffer wird nichts sichtbar). Wäre bei einem Computerspiel gar nicht so toll, wenn das Raumschiff (oder was auch immer) plötzlich verschwindet, obwohl es den Bildschirm nicht ganz verlassen hat. Sicherlich könntet Ihr auch solch ein Spiel machen, wo kein Objekt den Bildschirm verlässt aber... na Ihr wisst schon. Angenommen Ihr wolltet das nicht, DANN muss eine Lösung gefunden werden, um nur das Teilbild, welches sich noch im Bildschirm befindet anzuzeigen. Es gib sicherlich mehrer Möglichkeiten, dieses Problem zu lösen. Eine davon stelle ich euch vor! Wer das RECT Tutorial gelesen hat, weiß vielleicht auch das man das RECT auch als Fenster benutzen kann, um Teilbilder anzuzeigen.

Hier hat das gelbe RECT (destination RECT - Zielbereich) die Ausmaße des zu darstellenden Testbildes und wird als Ausgabe RECT benutzt. Das rote RECT (source RECT - Quellbreich) wird als Fenster benutzt um nur den Teil anzuzeigen der sich im Bildschirm befindet und enthält ebenfalls die Ausmaße des Teilbildes (die wird nicht im Bild gezeigt, relativ den Koordinaten des destination RECT angepasst ). D.h. wir müssen die Eigenschaften des destination RECT so manipulieren, dass es immer im Bildschirm bleibt während das Bitmap den Bildschirm verlässt. Die Koordianten des dest. RECT müssen absolut zu den Bildschirmkoordinaten sein, die des source RECT sind relativ zum Bitmap! Nun, 2x RECT mit der BltFast Mehode? Geht doch gar nicht! Richtig, deswegen benutzen wir auch hier die normale Blt Methode. Klartext: Das Source RECT sitzt auf dem Bitmap im Speicher (Surface) das destination RECT auf dem Bildschirm. Beispiel: Wenn wir die Ausmaße des source RECT nicht verändern (wie es im obigen Bild scheint) dann würde das Bild beim scrollen in den Bildschirm anfangs ganz klein und später immer größer werden bis es schließlich komplett im Bildschrim ist und seine Orginalgöße erreicht (es wird also anfangs verzerrt dargestellt)....

Es folgt der Beispielcode für eine Bildschirmauflösung von 640x480 :

Die Variablen dürfen gründlicherweise auch nicht fehlen ;)

Private destRECT As RECT

Private sourceRECT As RECT

 

 

Zuerst das sourceRECT mit den Ausmaßen des Bitmap füttern :D (am besten beim Laden des Surfaces)

 

sourceRECT.Bottom = 50 ' 50 pix hoch ist das gute Stück (euer natürlich nicht)

sourceRECT.Right = 60 'und 60 pix breit (ja, euer wahrscheinlich nicht ich weiß!)

 

Dann werden die Bildschirmkoordinaten für den Zielbereich festgelegt, wobei x,y die Position des Bildes angeben

 

destRECT.Top = y

destRECT.Left = x

destRECT.Bottom = y + sourceRECT.Bottom

destRECT.Right = x + sourceRECT.Right

 

Jetzt folgt der Alogrythmus, indem die RECT's angepasst werden (natürlich nur dann wenn sie den Bildschirm verlassen!)

 

'Surface zuschneiden

' Bildschirm nach unten verlassen / von unten erscheinen

If destRECT.Bottom > 480 Then

sourceRECT.Bottom = sourceRECT.Bottom - (destRECT.Bottom - 480)

destRECT.Bottom = 480

End If

' Bildschirm nach Links verlassen / von Links erscheinen

If destRECT.Left < 0 Then

sourceRECT.Left = sourceRECT.Left - destRECT.Left

destRECT.Left = 0

End If

' Bildschirm nach Rechts verlassen / von Rechts erscheinen

If destRECT.Right > 640 Then

sourceRECT.Right = sourceRECT.Right - (destRECT.Right - 640)

destRECT.Right = 640

End If

' Von oben in den Bildschirm erscheinen / nach oben hin den Bildschirm verlassen

If destRECT.Top < 0 Then

sourceRECT.Top = 0 - destRECT .TopdestRECT.Top = 0

End If

 

 

Zum Schlus die Blt Methode mit den Parametern, man beachte, dass hier keine x,y Koordinaten übergeben werden, weil diese sich schon im DestRECT befinden!

ddsBackbuffer.Blt ScreenRECT, Surface, RectTEMP, DDBLT_KEYSRC Or DDBLT_WAIT

 

Das ist der Algorithmus für eine Bildschirmauflösung von 640x480, mit ein wenig Anpassung kann man ihn aber auch für jede andere Auflösung benutzen. Man kann aber auch einen imaginären Bereich erstellen (sowas wie ein Grafikfenster), damit die Grafiken nicht einen bestimmten Bereich wie z.B. Punkte- oder Energieleiste nicht überschreiten. Probiert es aus ;). Viel Spaß!!!

 


Autor: Alexander Ney / Mehr Tutorials auf www.vb-overkill.de.vu