IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - Clipping im Vollbildmodus



Clipping im Vollbildmodus

Dieser Artikel zeigt, wie man Clipping-Probleme im Vollbildmodus bei der Programmierung von DirectX mit Visual Basic umschifft.


Autor: Tobias Surmann (incsoft)
Datum: 30-03-2003, 13:53:59
Referenzen: http://www.vbDirectX.de
Schwierigkeit: Profis
Ansichten: 4405x
Rating: 8 (1x bewertet)

Hinweis:

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.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einleitung

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

'Eigenschaften der primären Surface setzen
ddsdPrim.lFlags = DDSD_CAPS
ddsdPrim.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE

'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:
  1. Wir blitten alle Surfaces auf die Mischsurface
  2. Danach wird die Mischsurface mittels BLT auf die primäre Surface geblittet
  3. 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 


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06246
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1154
Comments: 0