I have tried making the form double buffered and stuff but it still does not work...
Basically its a powder game clone (example here: Powder Game
only problem is the more objects (such as sand) on the screen the more it flickers and with 100+ it becomes unusable (I was hoping to get at least 10,000 on screen at once...)
Heres the bit of code I believe is wrong
	
	
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
it refreshes the picture box which everything is displayed in every timer tick (20miliseconds)
Here is all the code:
	
	
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Note that the metal is placed at 50, 100 for testing purposes...
	
		
			
		
		
	
				
			Basically its a powder game clone (example here: Powder Game
only problem is the more objects (such as sand) on the screen the more it flickers and with 100+ it becomes unusable (I was hoping to get at least 10,000 on screen at once...)
Heres the bit of code I believe is wrong
			
				VB.NET:
			
		
		
		Private Sub drawall()
        PictureBox1.Refresh()
        dealwithsand()
        dealwithmetal()
End Sub
	Here is all the code:
			
				VB.NET:
			
		
		
		Public Class Form1
    Dim csand As Boolean
    Dim cmetal As Boolean
    Dim cnothing As Boolean
    Dim sand(300) As Point
    Dim metal(2) As Point
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Timer1.Start()
        metal(0) = New Point(50, 100)
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        drawall()
    End Sub
    Private Sub checkfree(ByVal point As Point)
        If sand.Contains(point) Then csand = True
        If metal.Contains(point) Then cmetal = True
        If csand = False AndAlso cmetal = False Then cnothing = True
    End Sub
    Private Sub clearcontains()
        csand = False
        cmetal = False
        cnothing = False
    End Sub
    Private Sub dealwithsand()
        For i As Integer = 0 To sand.Length - 1
            If sand(i).IsEmpty Then
            Else
                If sand(i).Y < PictureBox1.Height Then
                    Dim below As Point = New Point(sand(i).X, sand(i).Y + 1)
                    checkfree(below)
                    If csand = True Then
                    End If
                    If cmetal = True Then
                    End If
                    If cnothing = True Then
                        sand(i).Y = sand(i).Y + 1
                    End If
                    clearcontains()
                Else
                    sand(i) = New Point(0, 0)
                End If
                End If
        Next
        showsand()
    End Sub
    Private Sub dealwithmetal()
        showmetal()
    End Sub
    Private Sub showsand()
        For i As Integer = 0 To sand.Length - 1
            If sand(i).IsEmpty Then
            Else
                PictureBox1.CreateGraphics.DrawRectangle(Pens.DarkKhaki, sand(i).X, sand(i).Y, 1, 1)
            End If
        Next
    End Sub
    Private Sub showmetal()
        For i As Integer = 0 To metal.Length - 1
            If metal(i).IsEmpty Then
            Else
                PictureBox1.CreateGraphics.DrawRectangle(Pens.Gray, metal(i).X, metal(i).Y, 1, 1)
            End If
        Next
    End Sub
    Private Sub drawall()
        PictureBox1.Refresh()
        dealwithsand()
        dealwithmetal()
    End Sub
    Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseDown
        emititem.Start()
    End Sub
    Private Sub PictureBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseUp
        emititem.Stop()
    End Sub
    Private Sub emititem_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles emititem.Tick
        Dim done As Boolean = False
        For i As Integer = 0 To sand.Length - 1
            If done = False Then
                If sand(i).IsEmpty = True Then
                    Dim droppoint As New Point(MousePosition.X - Me.Location.X - 24, MousePosition.Y - Me.Location.Y - 43)
                    checkfree(droppoint)
                    If cnothing = True Then
                        sand(i) = New Point(MousePosition.X - Me.Location.X - 24, MousePosition.Y - Me.Location.Y - 43)
                        done = True
                    Else
                    End If
                End If
            End If
        Next
    End Sub
End Class
	Note that the metal is placed at 50, 100 for testing purposes...