Hallo,
ich möchte mir eine Spiele-Engine schreiben, wo ich z.B. Sprites über den Bildschirm bewegen kann und auf Kollision mit Bildschirmhintergrund oder mit anderen Sprites abfragen kann.
Dazu muß man ja u.a. XOR Verknüpfungen der einzelnen Bitmaps machen. Doch wie das geht, weiß ich nicht. Kann mir da jemand helfen? eine andere Möglichkeit wäre mit transparenten Farben zu arbeiten, aber hier hab ich auch keine Ahnung.
Ich kenne die bitblt-Methode der GDI, aber da muß ich jedes Bitmap in eine PictureBox laden, die zur Laufzeit erstellt wird und anschließend benötige ich von jeder PictureBox das hDC dazu. Programmiert hätte ich es ja soweit, aber es funktiniert nicht. Deshalb suche ich (auch) nach einer Alternative. Außer jemand kann mir meinen Fehler erklären.
Hier der code:
Friend Sub Paint(ByVal s As Bitmap, ByVal smask As Bitmap, ByVal x As Integer, _
ByVal y As Integer)
Dim g As Graphics = Form1.PictureBox1.CreateGraphics
Dim g2 As Graphics = Form1.PictureBox2.CreateGraphics
Dim Pbox(9) As PictureBox
For i As Integer = 0 To 1
Pbox(i) = New PictureBox
Next
Form1.PictureBox2.Load(myPfad + "hintergrundmitgang.gif")
Pbox(0).Load(myPfad & "ufo.gif")
Pbox(1).Load(myPfad & "ufo_mask.gif")
Using dcDest As New GdiDeviceContext(g)
Using dcSrc As New GdiDeviceContext(g2)
Using dcBitmap As New GdiDeviceContext(Pbox(0).CreateGraphics)
Using dcSrcMask As New GdiDeviceContext(Pbox( _
1).CreateGraphics)
BitBlt(dcDest, 0, 0, Form1.PictureBox1.Width, _
Form1.PictureBox1.Height, dcSrc, 0, 0, _
TernaryRasterOperations.SRCCOPY)
BitBlt(dcDest, x, y, Pbox(0).Image.Width, Pbox( _
0).Image.Height, dcBitmap, 0, 0, _
TernaryRasterOperations.SRCAND)
BitBlt(dcDest, x, y, Pbox(1).Image.Width, Pbox( _
1).Image.Height, dcSrcMask, 0, 0, _
TernaryRasterOperations.SRCINVERT)
End Using
End Using
End Using
End Using
'g.DrawImage(Pbox(1).Image, x, y)
End Sub Ergebnis:
das erste bitblt funktioniert! Auch mit den richtigen Bitmaps.
die beiden anderen nicht! Darin befindet sich als Bitmap irgendein Hintergrundausschnitt vom Visual Studio, doch ich hab die beiden Pbox(0) und Pbox(1) doch weiter oben mit dem 'load' Befehl geladen! Wenn man das ausge-REM-te 'g.DrawImage(Pbox(1).Image, x, y) ausführt, wird ja auch mein Ufo angezeigt!!?!?
Was läuft hier schief? Ich nehme an, daß die dc's von den zur Laufzeit generierten Pbox'en nicht stimmen. aber warum?
Schöne Grüße,
Alois |