Guten Abend,
Ich bin gerade dabei ein 2D-Spiel mit Direct2D zu schreiben. Bis jetzt wird auch alles gerendert, allerdings würde ich verschiedenen Objekten gerne Texturen geben.
Das Problem liegt jetzt nur dabei, dass ich, wenn ich Bitmap per DrawBitmap() zeichnen will immer nur so halbtransparente blaue oder auch rote (je nach Grundfarbe) Rechtecke bekomme, was ja nicht Sinn des ganzen ist.
Die Bilder lade ich momentan mit diesem Code:
und ich zeichne das ganze mit:
Ich hoffe mir kann jemand erklären, wo der Fehler liegt.
Danke schon mal im Voraus.
Ich bin gerade dabei ein 2D-Spiel mit Direct2D zu schreiben. Bis jetzt wird auch alles gerendert, allerdings würde ich verschiedenen Objekten gerne Texturen geben.
Das Problem liegt jetzt nur dabei, dass ich, wenn ich Bitmap per DrawBitmap() zeichnen will immer nur so halbtransparente blaue oder auch rote (je nach Grundfarbe) Rechtecke bekomme, was ja nicht Sinn des ganzen ist.
Die Bilder lade ich momentan mit diesem Code:
Quellcode
- Public Shared Function LoadFromFile(ByVal renderTarget As RenderTarget, ByVal file As String) As Bitmap
- ' Loads from file using System.Drawing.Image
- Using bitmap = DirectCast(System.Drawing.Image.FromFile(file), System.Drawing.Bitmap)
- Dim sourceArea = New System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height)
- Dim bitmapProperties = New BitmapProperties(New PixelFormat(Format.R8G8B8A8_UNorm, Direct2D1.AlphaMode.Premultiplied))
- Dim size = New Size2(bitmap.Width, bitmap.Height)
- ' Transform pixels from BGRA to RGBA
- Dim stride As Integer = bitmap.Width * 4
- Using tempStream = New DataStream(bitmap.Height * stride, True, True)
- ' Lock System.Drawing.Bitmap
- Dim bitmapData = bitmap.LockBits(sourceArea, Imaging.ImageLockMode.[ReadOnly], System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
- ' Convert all pixels
- For y As Integer = 0 To bitmap.Height - 1
- Dim offset As Integer = bitmapData.Stride * y
- For x As Integer = 0 To bitmap.Width - 1
- ' Not optimized
- Dim B As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
- Dim G As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
- Dim R As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
- Dim A As Byte = Runtime.InteropServices.Marshal.ReadByte(bitmapData.Scan0, System.Math.Max(System.Threading.Interlocked.Increment(offset), offset - 1))
- Dim rgba As Integer = R Or (G << 8) Or (B << 16) Or (A << 24)
- tempStream.Write(rgba)
- Next
- Next
- bitmap.UnlockBits(bitmapData)
- tempStream.Position = 0
- Return New Bitmap(renderTarget, size, tempStream, stride, bitmapProperties)
- End Using
- End Using
- End Function
und ich zeichne das ganze mit:
Ich hoffe mir kann jemand erklären, wo der Fehler liegt.
Danke schon mal im Voraus.
Auch Dunkelheit kann Erleuchtung bringen...