Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform,
sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc
zu kontaktieren.
Habt ihr schonmal probiert mit DirectDraw für Visual Basic im Vollbildmodus zu clippen? Der Versuch, dies auf normalem DirectDrawClipper-Weg zu tun schlägt auf jeden Fall fehl. Das liegt daran, das der DirectDrawClipper nur für den Fenstermodus benutzt werden kann. Zum Glück gibt es einen kleinen Trick wie man es trotzdem schaffen kann mit DirectDraw im Fullscreen-Mode zu clippen, ohne irgendwelche RECTS so berechnen zu müssen, dass sie richtig am Rand abgeschnitten werden, was nämlich sehr viel CPU-Zeit verbraucht.
Die Lösung wird anhand eines kleinen Beispiels erklärt.
Zuerst starten wir ein neues Projekt und binden die DirectX 7 for Visual Basic Type Library über Projekt - Verweise... ein.
Nun schreiben wir eine private Initialisierungsroutine für DirectDraw. Um also das Sprite sanft in den Bildschirm zu scrollen, erzeugen wir eine Offscreensurface (Mischsurface), welche größer als die primäre Surface ist. Bei einigen Grafikkarten kann es dabei zu Problemen kommen. In diesem speziellen Fall muss die Surface explizit in den Systemspeicher ausgelagert werden.
Private Sub DDInit()
'Eigenschaften der primären Surface deklarieren
Dim ddsdPrim As DDSURFACEDESC2
'Eigenschaften der Hintergrundbild-Surface deklarieren
Dim ddsdBG As DDSURFACEDESC2
'Eigenschaften der Mischsurface deklarieren
Dim ddsdMisch As DDSURFACEDESC2
'DirectDraw-Objekt erzeugen
Set g_DD = g_DX.DirectDrawCreate("")
'Fullscreen-Modus setzen
Call g_DD.SetCooperativeLevel(Form1.hWnd, DDSCL_FULLSCREEN Or DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE)
'Auflösung auf 640x480 setzen
g_DD.SetDisplayMode 640, 480, 16, 0, DDSDM_DEFAULT
'primäre Surface erzeugen
Set PrimSurf = g_DD.CreateSurface(ddsdPrim)
'Eigenschaften der Hintergrundbild-Surface setzen
ddsdBG.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
ddsdBG.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
'Hintergrundbild-Surface aus Datei "hintergrund.bmp" erzeugen
Set BGSurf = g_DD.CreateSurfaceFromFile(App.Path & "\hintergrund.bmp", ddsdBG)
'Größe der Hintergrundbild-Rects setzen
RECTBG.Bottom = ddsdBG.lHeight
RECTBG.Right = ddsdBG.lWidth
'Eigenschaften der Mischsurface setzen
ddsdMisch.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
ddsdMisch.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
'Wir machen die Mischsurface 200 Pixel in der Breite und 200 Pixel in der Höhe größer als die primäre Surface.
ddsdMisch.lWidth = 640 + 200
ddsdMisch.lHeight = 480 + 200
'Mischsurface erzeugen
Set MischSurf = g_DD.CreateSurface(ddsdMisch)
'Außerdem setzen wir die Anfangskoordinaten auf 100 für X-Achse und Y-Achse.
RECTMisch.Top = 100
RECTMisch.Left = 100
RECTMisch.Bottom = ddsdMisch.lHeight
RECTMisch.Right = ddsdMisch.lWidth
End Sub
Ok, das wär's erstmal für die Initialisierungroutine. Nun können wir die weitere Vorgehensweise in 3 Schritte einteilen:
Wir blitten alle Surfaces auf die Mischsurface
Danach wird die Mischsurface mittels BLT auf die primäre Surface geblittet
GameLoop schreiben
1. Schritt:
Private Sub DrawMisch()
Dim tmpRECT As RECT
tmpRECT = RECTBG
MischSurf.Blt tmpRECT, BGSurf, RECTBG
End Sub
2. Schritt:
Private Sub BLTSurf()
Dim tmpRECT
tmpRECT.Top = 0
tmpRECT.Left = 0
tmpRECT.Height = 480
tmpRECT.Width = 640
PrimSurf.Blt RECTBG, MischSurf, tmpRECT
End Sub
3. Schritt:
Private Sub GameLoop()
Dim x As Long
x = -320
Do
'Das Hintergrundbild soll von links nach rechts scrollen
x = x + 1
If x > 1280 Then End
RECTBG.Left = x
RECTBG.Left = x + 640
Call DrawMisch
Call BLTSurf
'Am besten irgendeine Bedingung mit Until formulieren,
'damit das Programm nicht endlos läuft
Loop 'Until Bedingung
End Sub