Quantcast
Channel: .NET Framework Class Libraries forum
Viewing all articles
Browse latest Browse all 8156

HELP! Tile editor error.

$
0
0

Hi,

I'm working on a tile editor with SlimDX and VB.Net. I keep getting this weird error on the line in Form1.vb that says :

Bitmaps(b, a).FromBitmap(MyBitmap, New Point(0, 0), New Retangle(a * Width, b * Height, Width, Height))

when I click on add in the context menu in the tilesets list view. The error is : "An invalid parameter was passed to the returning function.". Here's my code:

Form1.vb:

Imports SlimDX

Public Class Form1
    Dim TileX As Integer = 0
    Dim TileY As Integer = 0
    Structure Layer
        Dim Name As String
        Sub New(Name As String)
            Me.Name = Name
        End Sub
    End Structure
    Structure Tileset
        Dim Name As String
        Dim Bitmaps As Array
        Sub New(Name As String, Bitmaps As Array)
            Me.Name = Name
            Me.Bitmaps = Bitmaps
        End Sub
    End Structure
    Public Layers As New List(Of Layer)
    Public Tilesets As New List(Of Tileset)
    Function ConvertGDIBitmapToDirect2DBitmap(MyBitmap As Bitmap, WindowRenderTarget As Direct2D.WindowRenderTarget) As Direct2D.Bitmap
        Dim MyBitmapData As Imaging.BitmapData = MyBitmap.LockBits(New Rectangle(0, 0, MyBitmap.Width, MyBitmap.Height), Imaging.ImageLockMode.ReadWrite, Imaging.PixelFormat.Format32bppPArgb)
        Dim MyDataStream As New DataStream(MyBitmapData.Scan0, MyBitmapData.Stride * MyBitmapData.Height, True, True)
        Dim MyBitmapProperties As New Direct2D.BitmapProperties()
        MyBitmapProperties.PixelFormat = New Direct2D.PixelFormat(DXGI.Format.R8G8B8A8_UNorm, Direct2D.AlphaMode.Premultiplied)
        Dim MyDirect2DBitmap As New Direct2D.Bitmap(WindowRenderTarget, New Size(MyBitmapData.Width, MyBitmapData.Height), MyDataStream, MyBitmapData.Stride, MyBitmapProperties)
        MyBitmap.UnlockBits(MyBitmapData)
        Return MyDirect2DBitmap
    End Function
    Function SplitDirect2DBitmap(Width As Integer, Height As Integer, MyBitmap As Direct2D.Bitmap, WindowRenderTarget As Direct2D.WindowRenderTarget) As Array
        Dim Bitmaps As Array = Array.CreateInstance(GetType(Direct2D.Bitmap), CInt(Math.Floor(MyBitmap.PixelSize.Height / Height)), CInt(Math.Floor(MyBitmap.PixelSize.Width / Width)))
        Dim MyBitmapProperties As New Direct2D.BitmapProperties
        MyBitmapProperties.PixelFormat = New Direct2D.PixelFormat(DXGI.Format.B8G8R8A8_UNorm, Direct2D.AlphaMode.Premultiplied)
        For a = 0 To Math.Floor(MyBitmap.PixelSize.Width / Width)
            For b = 0 To Math.Floor(MyBitmap.PixelSize.Height / Height)
                Bitmaps(b, a) = New Direct2D.Bitmap(WindowRenderTarget, New Size(Width, Height), MyBitmapProperties)
                Bitmaps(b, a).FromBitmap(MyBitmap, New Point(0, 0), New Rectangle(a * Width, b * Height, Width, Height))
            Next
        Next
        Return Bitmaps
    End Function
    Sub DrawTransparent(Width As Integer, Height As Integer, WindowRenderTarget As Direct2D.WindowRenderTarget)
        Dim X As Integer = Math.Floor(WindowRenderTarget.PixelSize.Width / Width)
        Dim Y As Integer = Math.Floor(WindowRenderTarget.PixelSize.Height / Height)
        For a = 0 To X
            For b = 0 To Y
                If a Mod 2 = 0 Then
                    If b Mod 2 = 0 Then
                        WindowRenderTarget.FillRectangle(New Direct2D.SolidColorBrush(WindowRenderTarget, New Color4(1, 0.75, 0.75, 0.75)), New Rectangle(a * Width, b * Height, Width, Height))
                    Else
                        WindowRenderTarget.FillRectangle(New Direct2D.SolidColorBrush(WindowRenderTarget, New Color4(1, 1, 1, 1)), New Rectangle(a * Width, b * Height, Width, Height))
                    End If
                Else
                    If b Mod 2 = 0 Then
                        WindowRenderTarget.FillRectangle(New Direct2D.SolidColorBrush(WindowRenderTarget, New Color4(1, 1, 1, 1)), New Rectangle(a * Width, b * Height, Width, Height))
                    Else
                        WindowRenderTarget.FillRectangle(New Direct2D.SolidColorBrush(WindowRenderTarget, New Color4(1, 0.75, 0.75, 0.75)), New Rectangle(a * Width, b * Height, Width, Height))
                    End If
                End If
            Next
        Next
    End Sub
    Sub DrawGrid(X As Integer, Y As Integer, Width As Integer, Height As Integer, Color As Color4, WindowRenderTarget As Direct2D.WindowRenderTarget)
        For a = 0 To X
            WindowRenderTarget.DrawLine(New Direct2D.SolidColorBrush(WindowRenderTarget, Color), a * Width, 0, a * Width, Y * Height)
        Next
        For a = 0 To Y
            WindowRenderTarget.DrawLine(New Direct2D.SolidColorBrush(WindowRenderTarget, Color), 0, a * Height, X * Width, a * Height)
        Next
    End Sub
    Dim LayersFactory As Direct2D.Factory
    Dim LayersWindowRenderTargetProperties As Direct2D.WindowRenderTargetProperties
    Public LayersWindowRenderTarget As Direct2D.WindowRenderTarget
    Dim TilesetsFactory As Direct2D.Factory
    Dim TilesetsWindowRenderTargetProperties As Direct2D.WindowRenderTargetProperties
    Public TilesetsWindowRenderTarget As Direct2D.WindowRenderTarget
    Dim MainFactory As Direct2D.Factory
    Dim MainWindowRenderTargetProperties As Direct2D.WindowRenderTargetProperties
    Public MainWindowRenderTarget As Direct2D.WindowRenderTarget
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LayersFactory = New Direct2D.Factory()
        LayersWindowRenderTargetProperties = New Direct2D.WindowRenderTargetProperties()
        LayersWindowRenderTargetProperties.Handle = SplitContainer2.Panel2.Handle
        LayersWindowRenderTargetProperties.PixelSize = SplitContainer2.Panel2.ClientSize
        LayersWindowRenderTargetProperties.PresentOptions = Direct2D.PresentOptions.None
        LayersWindowRenderTarget = New Direct2D.WindowRenderTarget(LayersFactory, LayersWindowRenderTargetProperties)
        TilesetsFactory = New Direct2D.Factory()
        TilesetsWindowRenderTargetProperties = New Direct2D.WindowRenderTargetProperties()
        TilesetsWindowRenderTargetProperties.Handle = SplitContainer3.Panel2.Handle
        TilesetsWindowRenderTargetProperties.PixelSize = SplitContainer3.Panel2.ClientSize
        TilesetsWindowRenderTargetProperties.PresentOptions = Direct2D.PresentOptions.None
        TilesetsWindowRenderTarget = New Direct2D.WindowRenderTarget(TilesetsFactory, TilesetsWindowRenderTargetProperties)
        MainFactory = New Direct2D.Factory()
        MainWindowRenderTargetProperties = New Direct2D.WindowRenderTargetProperties()
        MainWindowRenderTargetProperties.Handle = SplitContainer1.Panel2.Handle
        MainWindowRenderTargetProperties.PixelSize = SplitContainer1.Panel2.ClientSize
        MainWindowRenderTargetProperties.PresentOptions = Direct2D.PresentOptions.None
        MainWindowRenderTarget = New Direct2D.WindowRenderTarget(MainFactory, MainWindowRenderTargetProperties)
        LayersWindowRenderTarget.AntialiasMode = Direct2D.AntialiasMode.Aliased
        TilesetsWindowRenderTarget.AntialiasMode = Direct2D.AntialiasMode.Aliased
        MainWindowRenderTarget.AntialiasMode = Direct2D.AntialiasMode.Aliased
    End Sub
    Private Sub SplitContainer1_SplitterMoved(sender As Object, e As SplitterEventArgs) Handles SplitContainer1.SplitterMoved
        TabControl1.Width = SplitContainer1.Panel1.Width + 2
        ListView1.Width = SplitContainer1.Panel1.Width - 12
        ListView2.Width = SplitContainer1.Panel1.Width - 12
        If SplitContainer1.Panel2.IsHandleCreated Then
            MainWindowRenderTarget.Resize(SplitContainer1.Panel2.ClientSize)
        End If
        If SplitContainer2.Panel2.IsHandleCreated Then
            LayersWindowRenderTarget.Resize(SplitContainer2.Panel2.ClientSize)
        End If
        If SplitContainer3.Panel2.IsHandleCreated Then
            TilesetsWindowRenderTarget.Resize(SplitContainer3.Panel2.ClientSize)
        End If
    End Sub
    Private Sub SplitContainer2_SplitterMoved(sender As Object, e As SplitterEventArgs) Handles SplitContainer2.SplitterMoved
        ListView1.Height = SplitContainer2.Panel1.Height
        If SplitContainer2.Panel2.IsHandleCreated Then
            LayersWindowRenderTarget.Resize(SplitContainer2.Panel2.ClientSize)
        End If
    End Sub
    Private Sub SplitContainer3_SplitterMoved(sender As Object, e As SplitterEventArgs) Handles SplitContainer3.SplitterMoved
        ListView2.Height = SplitContainer3.Panel1.Height
        If SplitContainer3.Panel2.IsHandleCreated Then
            TilesetsWindowRenderTarget.Resize(SplitContainer3.Panel2.ClientSize)
        End If
    End Sub
    Private Sub SplitContainer2_Panel2_Paint(sender As Object, e As PaintEventArgs) Handles SplitContainer2.Panel2.Paint
        LayersWindowRenderTarget.BeginDraw()
        DrawTransparent(16, 16, LayersWindowRenderTarget)
        If Not ListView1.SelectedIndices.Count = 0 Then

        End If
        LayersWindowRenderTarget.EndDraw()
    End Sub
    Private Sub SplitContainer3_Panel2_Paint(sender As Object, e As PaintEventArgs) Handles SplitContainer3.Panel2.Paint
        TilesetsWindowRenderTarget.BeginDraw()
        DrawTransparent(16, 16, TilesetsWindowRenderTarget)
        If Not ListView2.SelectedIndices.Count = 0 Then
            For a = 0 To Tilesets(ListView2.SelectedIndices(0)).Bitmaps.GetUpperBound(0) - 1
                For b = 0 To Tilesets(ListView2.SelectedIndices(0)).Bitmaps.GetUpperBound(1) - 1
                    TilesetsWindowRenderTarget.DrawBitmap(Tilesets(ListView2.SelectedIndices(0)).Bitmaps(b, a), New Rectangle(a * 32, b * 32, 32, 32))
                Next
            Next
            DrawGrid(Tilesets(ListView2.SelectedIndices(0)).Bitmaps.GetUpperBound(1), Tilesets(ListView2.SelectedIndices(0)).Bitmaps.GetUpperBound(0), 32, 32, New Color4(1, 0.5, 0.5, 0.5), TilesetsWindowRenderTarget)
            TilesetsWindowRenderTarget.DrawRectangle(New Direct2D.SolidColorBrush(TilesetsWindowRenderTarget, New Color4(1, 0.25, 0.25, 0.25)), New Rectangle(TileX * 32, TileY * 32, 32, 32))
        End If
        TilesetsWindowRenderTarget.EndDraw()
    End Sub
    Private Sub SplitContainer1_Panel2_Paint(sender As Object, e As PaintEventArgs) Handles SplitContainer1.Panel2.Paint
        MainWindowRenderTarget.BeginDraw()
        DrawTransparent(16, 16, MainWindowRenderTarget)
        MainWindowRenderTarget.EndDraw()
    End Sub
    Private Sub ContextMenuStrip1_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
        If ListView1.SelectedIndices.Count = 0 Then
            RemoveToolStripMenuItem.Enabled = False
            MoveUpToolStripMenuItem.Enabled = False
            MoveDownToolStripMenuItem.Enabled = False
            PropertiesToolStripMenuItem.Enabled = False
        Else
            RemoveToolStripMenuItem.Enabled = True
            If ListView1.SelectedIndices(0) = 0 Then
                MoveUpToolStripMenuItem.Enabled = False
            Else
                MoveUpToolStripMenuItem.Enabled = True
            End If
            If ListView1.SelectedIndices(0) = ListView1.Items.Count - 1 Then
                MoveDownToolStripMenuItem.Enabled = False
            Else
                MoveDownToolStripMenuItem.Enabled = True
            End If
            PropertiesToolStripMenuItem.Enabled = True
        End If
    End Sub
    Private Sub AddToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AddToolStripMenuItem.Click
        Dim Name As String = "Layer " + CStr(Layers.Count + 1)
        ListView1.Items.Add(New ListViewItem(Name))
        Layers.Add(New Layer(Name))
    End Sub
    Private Sub RemoveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RemoveToolStripMenuItem.Click
        Dim Index As Integer = ListView1.SelectedIndices(0)
        ListView1.Items.RemoveAt(Index)
        Layers.RemoveAt(Index)
    End Sub
    Private Sub MoveUpToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MoveUpToolStripMenuItem.Click

    End Sub
    Private Sub MoveDownToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MoveDownToolStripMenuItem.Click

    End Sub
    Private Sub PropertiesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PropertiesToolStripMenuItem.Click
        LayerProperties.ShowDialog()
    End Sub
    Private Sub ContextMenuStrip2_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip2.Opening
        If ListView2.SelectedIndices.Count = 0 Then
            RemoveToolStripMenuItem1.Enabled = False
            MoveUpToolStripMenuItem1.Enabled = False
            MoveDownToolStripMenuItem1.Enabled = False
            PropertiesToolStripMenuItem1.Enabled = False
        Else
            RemoveToolStripMenuItem1.Enabled = True
            If ListView2.SelectedIndices(0) = 0 Then
                MoveUpToolStripMenuItem1.Enabled = False
            Else
                MoveUpToolStripMenuItem1.Enabled = True
            End If
            If ListView2.SelectedIndices(0) = ListView2.Items.Count - 1 Then
                MoveDownToolStripMenuItem1.Enabled = False
            Else
                MoveDownToolStripMenuItem1.Enabled = True
            End If
            PropertiesToolStripMenuItem1.Enabled = True
        End If
    End Sub
    Private Sub AddToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles AddToolStripMenuItem1.Click
        Dim Name As String = "Tileset " + CStr(Tilesets.Count + 1)
        ListView2.Items.Add(New ListViewItem(Name))
        Tilesets.Add(New Tileset(Name, SplitDirect2DBitmap(32, 32, ConvertGDIBitmapToDirect2DBitmap(New Bitmap("Tile.png"), TilesetsWindowRenderTarget), TilesetsWindowRenderTarget)))
    End Sub
    Private Sub RemoveToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles RemoveToolStripMenuItem1.Click
        Dim Index As Integer = ListView2.SelectedIndices(0)
        ListView2.Items.RemoveAt(Index)
        Tilesets.RemoveAt(Index)
    End Sub
    Private Sub MoveUpToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles MoveUpToolStripMenuItem1.Click

    End Sub
    Private Sub MoveDownToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles MoveDownToolStripMenuItem1.Click

    End Sub
    Private Sub PropertiesToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles PropertiesToolStripMenuItem1.Click
        TilesetProperties.ShowDialog()
    End Sub
    Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged
        SplitContainer2.Panel2.Invalidate()
    End Sub
    Private Sub ListView2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView2.SelectedIndexChanged
        SplitContainer3.Panel2.Invalidate()
    End Sub
    Private Sub SplitContainer2_Panel2_Click(sender As Object, e As MouseEventArgs) Handles SplitContainer2.Panel2.Click
        If Not ListView1.SelectedIndices.Count = 0 Then

        End If
    End Sub
    Private Sub SplitContainer3_Panel2_Click(sender As Object, e As MouseEventArgs) Handles SplitContainer3.Panel2.Click
        If Not ListView2.SelectedIndices.Count = 0 Then
            'TileX = Math.Min(Math.Floor(e.X / 32), Math.Floor(Tilesets(ListView2.SelectedIndices(0)).Bitmap.Size.Width / 32) - 1)
            'TileY = Math.Min(Math.Floor(e.Y / 32), Math.Floor(Tilesets(ListView2.SelectedIndices(0)).Bitmap.Size.Height / 32) - 1)
            TileX = Math.Min(Math.Floor(e.X / 32), Tilesets(ListView2.SelectedIndices(0)).Bitmaps.GetUpperBound(1))
            TileX = Math.Min(Math.Floor(e.Y / 32), Tilesets(ListView2.SelectedIndices(0)).Bitmaps.GetUpperBound(0))
            SplitContainer3.Panel2.Invalidate()
        End If
    End Sub
    Private Sub SplitContainer1_Panel2_Click(sender As Object, e As MouseEventArgs) Handles SplitContainer1.Panel2.Click

    End Sub
End Class

LayerProperties.vb:

Public Class LayerProperties
    Private Sub LayerProperties_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = Form1.Layers(Form1.ListView1.SelectedIndices(0)).Name
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Form1.Layers(Form1.ListView1.SelectedIndices(0)) = New Form1.Layer(TextBox1.Text)
        Form1.ListView1.Items(Form1.ListView1.SelectedIndices(0)) = New ListViewItem(TextBox1.Text)
        Me.Close()
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Me.Close()
    End Sub
End Class

TilesetProperties.vb:

Imports SlimDX

Public Class TilesetProperties
    Private Sub TilesetProperties_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.Text = Form1.Tilesets(Form1.ListView2.SelectedIndices(0)).Name
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim OldBitmap As Direct2D.Bitmap = Form1.ConvertGDIBitmapToDirect2DBitmap(New Bitmap(TextBox2.Text), Form1.TilesetsWindowRenderTarget)
        Dim NewBitmap As New Direct2D.Bitmap(Form1.TilesetsWindowRenderTarget, New Size(Math.Ceiling(OldBitmap.PixelSize.Width / 32) * 32, Math.Ceiling(OldBitmap.PixelSize.Height / 32) * 32))
        NewBitmap.FromBitmap(OldBitmap, New Point(0, 0), New Rectangle(0, 0, OldBitmap.PixelSize.Width, OldBitmap.PixelSize.Height))
        Form1.Tilesets(Form1.ListView2.SelectedIndices(0)) = New Form1.Tileset(TextBox1.Text, Form1.SplitDirect2DBitmap(32, 32, NewBitmap, Form1.TilesetsWindowRenderTarget))
        Me.Close()
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Me.Close()
    End Sub
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        OpenFileDialog1.ShowDialog()
    End Sub
    Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        TextBox2.Text = OpenFileDialog1.FileName
    End Sub
End Class

Thanks.



Viewing all articles
Browse latest Browse all 8156

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>