Contact

 
Google
Web www.alanphipps.com

 
   
 
   
www.alanphipps.com

.: The Game State

 
 

 

 

Ok, in this tutorial we have changes to nearly every section of our program and a large amount of new code too. The game state is very useful, it allows us an efficient way to pause our game and update our game, when i say update, i mean a time when we can load levels, textures, materials, etc. So without wasting any more time, download the source code from the last tutorial copy the code folder and rename the copy to GameState. As usual we will start in the Graphics Module and add the following declarations:

'Score Variables
Public HighScore As Integer = 0
Public CurrentScore As Integer = 0
Public TempScore As Integer = 0

'Gamestate variables control when the game is in play, or loading a level, or paused, etc
Public GameState As String = "WaitingToStart" 'Paused, Loading, Playing, GameWon, GameLost, WaitingToStart
Public CurrentLevel As Integer = 0 ' The level that is currently being played

'GameTime objects and variables
Public GameStopWatch As Stopwatch = New Stopwatch

'Texture Objects to be used during loading
Public Number1Tex As Texture2D = Nothing
Public Number2Tex As Texture2D = NOthing
Public Number3Tex As Texture2D = Nothing
Public LetsGoTex As Texture2D = Nothing
Public LetsGoRect As Rectangle = Nothing
Public CongratTex As Texture2D = Nothing
Public CongratRect As Rectangle = Nothing

'A couple of Global objects that will be set using the WriteText Sub below and run from the Render loop
Public CountDownTexture As Texture2D = Nothing
Public CountDownRect As Rectangle = Nothing

'The roof lowers at certain intervals
Public RoofTex As Texture2D = Nothing
Public RoofRect As Rectangle = Nothing

'Variable that holds the amount of time after which the roof will lower
Public RoofLowerAfter As Integer = 5000

'The game Over Text
Public GameOverTex As Texture2D = Nothing
Public GameOverRect As Rectangle = Nothing

'The Pause Text Objects
Public PauseTex As Texture2D = Nothing
Public PauseRect As Rectangle = Nothing

The GameState variable is a string and can be given any value you like, i have typed the values that i have chosen as a comment in the code. There are a number of new textures. The new WriteText function that i have will show you later is quite CPU intensive and hence i decided that any text that did not change during the game would be implemented as a texture and not using the writetext function. XNA has a gametime component that you can use to update particular parts of the game at specified intervals, however i was having trouble with it and so i am using the System.Diagnostics.StopWatch component instead. Because of the new object the DefineObjectDetails Sub becomes:

'Function to Define NonBall Details
Public Sub DefineObjectDetails()
MainSB = New SpriteBatch(Device)
BackgroundRect.Height = My.Forms.Form1.Bounds.Height
BackgroundRect.Width = My.Forms.Form1.Bounds.Width
BackgroundTex = Texture2D.FromFile(Device, "../../images/BackGround.png", NonBallTexCreationParams)
PlayAreaRect.Height = 480
PlayAreaRect.Width = 379
PlayAreaRect.X = 212
PlayAreaRect.Y = 60
PlayAreaTex = Texture2D.FromFile(Device, "../../images/WaitingToStart.png", NonBallTexCreationParams)
BallLauncherRect.Height = 107
BallLauncherRect.Width = 380
BallLauncherRect.X = 212
BallLauncherRect.Y = 433
BallLauncherTex = Texture2D.FromFile(Device, "../../images/BallLauncher.png", NonBallTexCreationParams)
ArrowTex = Texture2D.FromFile(Device, "../../images/Arrow.png", NonBallTexCreationParams)
Number1Tex = Texture2D.FromFile(Device, "../../images/Number1.png", NonBallTexCreationParams)
Number2Tex = Texture2D.FromFile(Device, "../../images/Number2.png", NonBallTexCreationParams)
Number3Tex = Texture2D.FromFile(Device, "../../images/Number3.png", NonBallTexCreationParams)
LetsGoTex = Texture2D.FromFile(Device, "../../images/LetsGo.png", NonBallTexCreationParams)
CongratTex = Texture2D.FromFile(Device, "../../images/Congrat.png", NonBallTexCreationParams)
LetsGoRect = New Rectangle(220, 225, 360, 150)
CountDownRect = New Rectangle(350, 225, 100, 150)
CongratRect = New Rectangle(220, 275, 360, 50)
RoofRect = New Rectangle(PlayAreaRect.X, PlayAreaRect.Y - 380, 480, 380)
RoofTex = Texture2D.FromFile(Device, "../../images/RoofTex.png", NonBallTexCreationParams)
GameOverTex = Texture2D.FromFile(Device, "../../images/GameOver.png", NonBallTexCreationParams)
GameOverRect = New Rectangle(275, 250, 250, 100)
PauseTex = Texture2D.FromFile(Device, "../../images/Paused.png", NonBallTexCreationParams)
PauseRect = New Rectangle(325, 275, 150, 50)
End Sub

The createball sub in the graphics module has been changed so that newly created balls can have their .IsInLauncher variable set during the creation sub, this solves a problem where balls that were created during game loading were not involved in collisions. This sub becomes:

'Sub to create ball, set BallColour to GetRandomColour() for a random colour
Public Sub CreateBall(ByVal BallColour As String, ByVal xpos As Integer, ByVal ypos As Integer, ByVal IsBalllauncher As Boolean)

Dim TempBall As Ball = New Ball
ReDim Preserve BallsArray(UBound(BallsArray) + 1)
TempBall.BallRect = New Rectangle(xpos, ypos, 38, 38)
TempBall.IsInLauncher = IsBalllauncher
TempBall.BallTex = Texture2D.FromFile(Device, "../../images/Ball" & BallColour & ".png", TempBall.BallTexCreationParams)
TempBall.IsMoving = False
TempBall.BallColour = BallColour
BallsArray(UBound(BallsArray)) = TempBall

TempBall = Nothing

End Sub

The new code is on Red, now, because this sub has changed, all calls to this sub must change to, as shown in the SetBallLauncherBalls() Sub

'Create Balls in the ball launcher
Public Sub SetBallLauncherBalls()

CreateBall(GetRandomColour(), BallLauncherRect1.X, BallLauncherRect1.Y, True)
CreateBall(GetRandomColour(), BallLauncherRect2.X, BallLauncherRect2.Y, True)
CreateBall(GetRandomColour(), BallLauncherRect3.X, BallLauncherRect3.Y, True)
CreateBall(GetRandomColour(), BallLauncherRect4.X, BallLauncherRect4.Y, True)
CreateBall(GetRandomColour(), BallLauncherRect5.X, BallLauncherRect5.Y, True)
CreateBall(GetRandomColour(), BallLauncherRect6.X, BallLauncherRect6.Y, True)
CreateBall(GetRandomColour(), BallLauncherRect7.X, BallLauncherRect7.Y, True)

End Sub

The new code is again in Red, when a ball is created using this sub it will have it's .IsInLauncher variable set to true and hence it will not be involved in any collisions. Next, we have a change to the FindTheBallToRemove() Sub:

'Find the Balls that are to be removed
Public Sub FindTheBallsToRemove()
'A variable for the ball colour
Dim TempBallColour As String = BallsArray(IndexOfMovingBall).BallColour
'An Array to hold all the balls of the same colour
Dim BallsOfTheSameColour() As Ball = New Ball() {}

'If this sub is running then 3 balls of the same colour have touched and will definitley be removed
'One of these balls will be the moving ball so we can set its deletion flag now
BallsArray(IndexOfMovingBall).MarkedForDeletionExplode = True
'If a ball has had its deletion marker set then set the global variable BallsNeedRemoved to True
'So that in the reder loop the RemoveBalls sub will run

BallsNeedRemoved = True

'For each ball in the ball array
For Each TempBall As Ball In BallsArray
'If it has already been deleted then ignore the ball
If TempBall.IsDeleted = False Then
'If the ball is in the ball launcher then ignore the ball
If TempBall.IsInLauncher = False Then
'If the ball is in the ball launcher then move on to the next ball
If TempBall.IsInLauncher = False Then
'If the current ball is the same colour as the moving ball
If TempBall.BallColour = TempBallColour Then
'Increease the size of the BallsOftheSameColourArray
ReDim Preserve BallsOfTheSameColour(UBound(BallsOfTheSameColour) + 1)
'And insert the current ball
BallsOfTheSameColour(UBound(BallsOfTheSameColour)) = TempBall
End If
End If
End If
End If
Next

'and a couple of bounding spheres for the other balls
Dim TempBoundingSphereOtherBall As BoundingSphere
Dim TempBoundingSphereOtherBall1 As BoundingSphere

'We will now loop through the ballsofthesamecolour array and compare them to every other ball in the array
'If a ball touches another ball that has its deletion marker set then the first ball will have it's deletion marker
'set. When the RemoveBalls sub runs, any ball with its deletion marker set will be deleted

Dim LoopAgainToGetAllBalls As Integer = 0
Dim UBoundBallArrayDividedBy5 As Single = UBound(BallsArray) / 5

'This sub loops twice
LoopAgain:
For Each TempBall1 As Ball In BallsOfTheSameColour
'If the ball is in the ball launcher then ignore the ball
If TempBall1.IsInLauncher = False Then
'Set the bounding sphere
TempBoundingSphereOtherBall = New BoundingSphere(New Vector3(TempBall1.BallRect.X, TempBall1.BallRect.Y, 0), 22)
'For each ball in the array
For Each TempBall2 As Ball In BallsOfTheSameColour
'If the ball is in the ball launcher then ignore the ball
If TempBall2.IsInLauncher = False Then
'Set it to the bounding sphere
TempBoundingSphereOtherBall1 = New BoundingSphere(New Vector3(TempBall2.BallRect.X, TempBall2.BallRect.Y, 0), 22)
'if the other ball has its deletion marker set then move on to the next ball
If TempBall1.MarkedForDeletionExplode = True Then
'Do the balls intersect
If TempBoundingSphereOtherBall1.Intersects(TempBoundingSphereOtherBall) = True Then
'If they do then set the other balls deletion marker
TempBall2.MarkedForDeletionExplode = True
End If
End If
End If
Next
End If
Next

'The bigger the ballsarray, the more loops will occur
If LoopAgainToGetAllBalls < CInt(UBoundBallArrayDividedBy5) Then
LoopAgainToGetAllBalls += 1
GoTo LoopAgain
End If

'Clear the variables and erase the array
TempBallColour = Nothing
Erase BallsOfTheSameColour
TempBoundingSphereOtherBall = Nothing
TempBoundingSphereOtherBall1 = Nothing
LoopAgainToGetAllBalls = Nothing

End Sub

The new code here repeats the loop a certain number of times, which is defined by the size of the balls array, the more balls the more the loop repeats. this ensures that all touching balls are found. There is an addition to the RemoveBalls Sub too:

'Remove Balls
Public Sub RemoveBalls()
'For each ball in the BallsArray
For Each TempBall As Ball In BallsArray
'If the balls have their deletion arker set then
If TempBall.IsDeleted = False Then
'if the ball is not in the ball launcher
If TempBall.IsInLauncher = False Then
'If the balls deletion maker (Explode) is set - another type of deletion marker will be used in
'in a future tutorial

If TempBall.MarkedForDeletionExplode = True Then
CreateParticles(TempBall) 'Create the particles used in the explosion
'If PointsAwarded = false then award the points

If TempBall.PointsAwarded = False Then
CurrentScore += 100
TempBall.PointsAwarded = True
End If

'Set the balls deletion marker
TempBall.IsDeleted = True
End If
End If
End If
Next
'Stop the RemoveBalls Sub running again
BallsNeedRemoved = False
End Sub

This new code basically adds 100 points to the CurrentScore variable when a ball is exploded. The 2 new subs in the graphics module are to do with the creation of levels, first is LoadLevel():

'Load a Level
Public Sub LoadLevel()
Dim rndnum As Integer = 0
If CurrentLevel <= 5 Then
rndnum = RandomizePub.Next(1, 10)
Else
rndnum = RandomizePub.Next(1, 17)
End If
DefineLevelBalls(rndnum)
rndnum = Nothing
End Sub

This sub basically gets a random number and calls the function DefineLevelBalls, the random number is passed into the function. There are 2 types of levels that i created, harder ones and easier ones, this sub will only select from the harder levels if the player has played more than 5 levels. The DefineLevelBalls Sub is big and looks like this:

'Define Balls During LoadLevel
Public Sub DefineLevelBalls(ByVal LevelNum As Integer)

'All balls in the game will be held in rectangle. These rectangles will cover the whole play area.
'These rectangles allow us to position balls correctly.

'Column A
Dim PARectA1 As Rectangle = New Rectangle(PlayAreaRect.X, PlayAreaRect.Y, 38, 38)
Dim PARectA2 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA1.Y + 38, 38, 38)
Dim PARectA3 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA2.Y + 38, 38, 38)
Dim PARectA4 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA3.Y + 38, 38, 38)
Dim PARectA5 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA4.Y + 38, 38, 38)
Dim PARectA6 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA5.Y + 38, 38, 38)
Dim PARectA7 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA6.Y + 38, 38, 38)
Dim PARectA8 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA7.Y + 38, 38, 38)
Dim PARectA9 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA8.Y + 38, 38, 38)
Dim PARectA10 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA9.Y + 38, 38, 38)
Dim PARectA11 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA10.Y + 38, 38, 38)
Dim PARectA12 As Rectangle = New Rectangle(PlayAreaRect.X, PARectA11.Y + 38, 38, 38)

'Column B
Dim PARectB1 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectB2 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectB3 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectB4 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectB5 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectB6 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectB7 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectB8 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectB9 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectB10 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectB11 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectB12 As Rectangle = New Rectangle(PlayAreaRect.X + 38, PARectA11.Y + 38, 38, 38)
'Column C
Dim PARectC1 As Rectangle = New Rectangle(PARectB1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectC2 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectC3 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectC4 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectC5 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectC6 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectC7 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectC8 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectC9 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectC10 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectC11 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectC12 As Rectangle = New Rectangle(PARectB1.X + 38, PARectA11.Y + 38, 38, 38)
'Column D
Dim PARectD1 As Rectangle = New Rectangle(PARectC1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectD2 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectD3 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectD4 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectD5 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectD6 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectD7 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectD8 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectD9 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectD10 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectD11 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectD12 As Rectangle = New Rectangle(PARectC1.X + 38, PARectA11.Y + 38, 38, 38)
'Column E
Dim PARectE1 As Rectangle = New Rectangle(PARectD1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectE2 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectE3 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectE4 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectE5 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectE6 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectE7 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectE8 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectE9 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectE10 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectE11 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectE12 As Rectangle = New Rectangle(PARectD1.X + 38, PARectA11.Y + 38, 38, 38)
'Column F
Dim PARectF1 As Rectangle = New Rectangle(PARectE1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectF2 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectF3 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectF4 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectF5 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectF6 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectF7 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectF8 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectF9 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectF10 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectF11 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectF12 As Rectangle = New Rectangle(PARectE1.X + 38, PARectA11.Y + 38, 38, 38)
'Column G
Dim PARectG1 As Rectangle = New Rectangle(PARectF1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectG2 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectG3 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectG4 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectG5 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectG6 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectG7 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectG8 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectG9 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectG10 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectG11 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectG12 As Rectangle = New Rectangle(PARectF1.X + 38, PARectA11.Y + 38, 38, 38)
'Column H
Dim PARectH1 As Rectangle = New Rectangle(PARectG1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectH2 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectH3 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectH4 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectH5 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectH6 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectH7 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectH8 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectH9 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectH10 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectH11 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectH12 As Rectangle = New Rectangle(PARectG1.X + 38, PARectA11.Y + 38, 38, 38)
'Column I
Dim PARectI1 As Rectangle = New Rectangle(PARectH1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectI2 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectI3 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectI4 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectI5 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectI6 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectI7 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectI8 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectI9 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectI10 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectI11 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectI12 As Rectangle = New Rectangle(PARectH1.X + 38, PARectA11.Y + 38, 38, 38)
'Column J
Dim PARectJ1 As Rectangle = New Rectangle(PARectI1.X + 38, PlayAreaRect.Y, 38, 38)
Dim PARectJ2 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA1.Y + 38, 38, 38)
Dim PARectJ3 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA2.Y + 38, 38, 38)
Dim PARectJ4 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA3.Y + 38, 38, 38)
Dim PARectJ5 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA4.Y + 38, 38, 38)
Dim PARectJ6 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA5.Y + 38, 38, 38)
Dim PARectJ7 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA6.Y + 38, 38, 38)
Dim PARectJ8 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA7.Y + 38, 38, 38)
Dim PARectJ9 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA8.Y + 38, 38, 38)
Dim PARectJ10 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA9.Y + 38, 38, 38)
Dim PARectJ11 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA10.Y + 38, 38, 38)
Dim PARectJ12 As Rectangle = New Rectangle(PARectI1.X + 38, PARectA11.Y + 38, 38, 38)

'We will now create balls in certain rectangles based on the value of LevelNum
'Levels 1 to 10 are easier than levels 11 to 19
'Thats why there is the If statement in the loadlevel sub, once the player reaches level 6 then the harder
'levels will come into play

Select Case LevelNum
Case Is = 1 'Level 1
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall("Black", PARectA2.X, PARectA2.Y, False)
CreateBall("Black", PARectB2.X, PARectB2.Y, False)
CreateBall("Black", PARectC2.X, PARectC2.Y, False)
CreateBall("Black", PARectE2.X, PARectE2.Y, False)
CreateBall("Black", PARectF2.X, PARectF2.Y, False)
CreateBall("Black", PARectH2.X, PARectH2.Y, False)
CreateBall("Black", PARectI2.X, PARectI2.Y, False)
CreateBall("Black", PARectJ2.X, PARectJ2.Y, False)
CreateBall("Blue", PARectA3.X, PARectA3.Y, False)
CreateBall("Blue", PARectB3.X, PARectB3.Y, False)
CreateBall("Blue", PARectC3.X, PARectC3.Y, False)
CreateBall("Blue", PARectE3.X, PARectE3.Y, False)
CreateBall("Blue", PARectF3.X, PARectF3.Y, False)
CreateBall("Blue", PARectH3.X, PARectH3.Y, False)
CreateBall("Blue", PARectI3.X, PARectI3.Y, False)
CreateBall("Blue", PARectJ3.X, PARectJ3.Y, False)
CreateBall("Yellow", PARectA4.X, PARectA4.Y, False)
CreateBall("Yellow", PARectB4.X, PARectB4.Y, False)
CreateBall("Yellow", PARectC4.X, PARectC4.Y, False)
CreateBall("Yellow", PARectE4.X, PARectE4.Y, False)
CreateBall("Yellow", PARectF4.X, PARectF4.Y, False)
CreateBall("Yellow", PARectH4.X, PARectH4.Y, False)
CreateBall("Yellow", PARectI4.X, PARectI4.Y, False)
CreateBall("Yellow", PARectJ4.X, PARectJ4.Y, False)
CreateBall("Green", PARectA5.X, PARectA5.Y, False)
CreateBall("Green", PARectB5.X, PARectB5.Y, False)
CreateBall("Green", PARectC5.X, PARectC5.Y, False)
CreateBall("Green", PARectE5.X, PARectE5.Y, False)
CreateBall("Green", PARectF5.X, PARectF5.Y, False)
CreateBall("Green", PARectH5.X, PARectH5.Y, False)
CreateBall("Green", PARectI5.X, PARectI5.Y, False)
CreateBall("Green", PARectJ5.X, PARectJ5.Y, False)
CreateBall("Red", PARectA6.X, PARectA6.Y, False)
CreateBall("Red", PARectB6.X, PARectB6.Y, False)
CreateBall("Red", PARectC6.X, PARectC6.Y, False)
CreateBall("Red", PARectD6.X, PARectD6.Y, False)
CreateBall("Red", PARectE6.X, PARectE6.Y, False)
CreateBall("Red", PARectF6.X, PARectF6.Y, False)
CreateBall("Red", PARectG6.X, PARectG6.Y, False)
CreateBall("Red", PARectH6.X, PARectH6.Y, False)
CreateBall("Red", PARectI6.X, PARectI6.Y, False)
CreateBall("Red", PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
Case Is = 2 'Level 2
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectB2.X, PARectB2.Y, False)
CreateBall(GetRandomColour(), PARectC2.X, PARectC2.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectH2.X, PARectH2.Y, False)
CreateBall(GetRandomColour(), PARectI2.X, PARectI2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectB3.X, PARectB3.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectI3.X, PARectI3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall(GetRandomColour(), PARectC4.X, PARectC4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectH4.X, PARectH4.Y, False)
CreateBall(GetRandomColour(), PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
Case Is = 3 'Level 3
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall("Red", PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall("Blue", PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall("Black", PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall("Green", PARectJ1.X, PARectJ1.Y, False)
CreateBall("Yellow", PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectB2.X, PARectB2.Y, False)
CreateBall("Red", PARectC2.X, PARectC2.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall("Blue", PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall("Black", PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectH2.X, PARectH2.Y, False)
CreateBall("Green", PARectI2.X, PARectI2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall("Yellow", PARectB3.X, PARectB3.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall("Red", PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall("Black", PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall("Green", PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectI3.X, PARectI3.Y, False)
CreateBall("Blue", PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall("Yellow", PARectC4.X, PARectC4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall("Red", PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall("Green", PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectH4.X, PARectH4.Y, False)
CreateBall("Blue", PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall("Yellow", PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall("Green", PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall("Blue", PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall("Yellow", PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall("Blue", PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall("Blue", PARectF7.X, PARectF7.Y, False)
Case Is = 4 ' Level 4
CreateBall("Blue", PARectA1.X, PARectA1.Y, False)
CreateBall("Red", PARectB1.X, PARectB1.Y, False)
CreateBall("Green", PARectC1.X, PARectC1.Y, False)
CreateBall("Yellow", PARectD1.X, PARectD1.Y, False)
CreateBall("Yellow", PARectE1.X, PARectE1.Y, False)
CreateBall("Yellow", PARectF1.X, PARectF1.Y, False)
CreateBall("Yellow", PARectG1.X, PARectG1.Y, False)
CreateBall("Green", PARectH1.X, PARectH1.Y, False)
CreateBall("Red", PARectI1.X, PARectI1.Y, False)
CreateBall("Blue", PARectJ1.X, PARectJ1.Y, False)
CreateBall("Blue", PARectA2.X, PARectA2.Y, False)
CreateBall("Red", PARectB2.X, PARectB2.Y, False)
CreateBall("Green", PARectC2.X, PARectC2.Y, False)
CreateBall("Blue", PARectD2.X, PARectD2.Y, False)
CreateBall("Blue", PARectE2.X, PARectE2.Y, False)
CreateBall("Blue", PARectF2.X, PARectF2.Y, False)
CreateBall("Blue", PARectG2.X, PARectG2.Y, False)
CreateBall("Green", PARectH2.X, PARectH2.Y, False)
CreateBall("Red", PARectI2.X, PARectI2.Y, False)
CreateBall("Blue", PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall("Red", PARectB3.X, PARectB3.Y, False)
CreateBall("Green", PARectC3.X, PARectC3.Y, False)
CreateBall("Red", PARectD3.X, PARectD3.Y, False)
CreateBall("Black", PARectE3.X, PARectE3.Y, False)
CreateBall("Black", PARectF3.X, PARectF3.Y, False)
CreateBall("Red", PARectG3.X, PARectG3.Y, False)
CreateBall("Green", PARectH3.X, PARectH3.Y, False)
CreateBall("Red", PARectI3.X, PARectI3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall("Green", PARectC4.X, PARectC4.Y, False)
CreateBall("Red", PARectD4.X, PARectD4.Y, False)
CreateBall("Black", PARectE4.X, PARectE4.Y, False)
CreateBall("Black", PARectF4.X, PARectF4.Y, False)
CreateBall("Red", PARectG4.X, PARectG4.Y, False)
CreateBall("Green", PARectH4.X, PARectH4.Y, False)
CreateBall(GetRandomColour(), PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall("Red", PARectD5.X, PARectD5.Y, False)
CreateBall("Black", PARectE5.X, PARectE5.Y, False)
CreateBall("Black", PARectF5.X, PARectF5.Y, False)
CreateBall("Red", PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall("Yellow", PARectE6.X, PARectE6.Y, False)
CreateBall("Yellow", PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
Case Is = 5 'Level 5
CreateBall("Green", PARectA1.X, PARectA1.Y, False)
CreateBall("Blue", PARectD1.X, PARectD1.Y, False)
CreateBall("Black", PARectG1.X, PARectG1.Y, False)
CreateBall("Yellow", PARectJ1.X, PARectJ1.Y, False)
CreateBall("Green", PARectA2.X, PARectA2.Y, False)
CreateBall("Blue", PARectD2.X, PARectD2.Y, False)
CreateBall("Blue", PARectE2.X, PARectE2.Y, False)
CreateBall("Black", PARectF2.X, PARectF2.Y, False)
CreateBall("Black", PARectG2.X, PARectG2.Y, False)
CreateBall("Yellow", PARectJ2.X, PARectJ2.Y, False)
CreateBall("Green", PARectA3.X, PARectA3.Y, False)
CreateBall("Yellow", PARectC3.X, PARectC3.Y, False)
CreateBall("Blue", PARectD3.X, PARectD3.Y, False)
CreateBall("Black", PARectG3.X, PARectG3.Y, False)
CreateBall("Green", PARectH3.X, PARectH3.Y, False)
CreateBall("Yellow", PARectJ3.X, PARectJ3.Y, False)
CreateBall("Green", PARectA4.X, PARectB4.Y, False)
CreateBall("Yellow", PARectB4.X, PARectB4.Y, False)
CreateBall("Blue", PARectD4.X, PARectD4.Y, False)
CreateBall("Black", PARectG4.X, PARectG4.Y, False)
CreateBall("Green", PARectI4.X, PARectI4.Y, False)
CreateBall("Yellow", PARectJ4.X, PARectJ4.Y, False)
CreateBall("Red", PARectB5.X, PARectB5.Y, False)
CreateBall("Red", PARectC5.X, PARectC5.Y, False)
CreateBall("Red", PARectD5.X, PARectD5.Y, False)
CreateBall("Red", PARectE5.X, PARectE5.Y, False)
CreateBall("Red", PARectF5.X, PARectF5.Y, False)
CreateBall("Red", PARectG5.X, PARectG5.Y, False)
CreateBall("Red", PARectH5.X, PARectH5.Y, False)
CreateBall("Red", PARectI5.X, PARectI5.Y, False)
CreateBall("Yellow", PARectB6.X, PARectB6.Y, False)
CreateBall("Blue", PARectD6.X, PARectD6.Y, False)
CreateBall("Black", PARectG6.X, PARectG6.Y, False)
CreateBall("Green", PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall("Blue", PARectD7.X, PARectD7.Y, False)
CreateBall("Black", PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectE8.X, PARectE8.Y, False)
CreateBall(GetRandomColour(), PARectF8.X, PARectF8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
Case Is = 6 'Level 6
CreateBall("Red", PARectA1.X, PARectA1.Y, False)
CreateBall("Red", PARectB1.X, PARectB1.Y, False)
CreateBall("Red", PARectC1.X, PARectC1.Y, False)
CreateBall("Red", PARectD1.X, PARectD1.Y, False)
CreateBall("Red", PARectG1.X, PARectG1.Y, False)
CreateBall("Red", PARectH1.X, PARectH1.Y, False)
CreateBall("Red", PARectI1.X, PARectI1.Y, False)
CreateBall("Red", PARectJ1.X, PARectJ1.Y, False)
CreateBall("Blue", PARectA2.X, PARectA2.Y, False)
CreateBall("Blue", PARectB2.X, PARectB2.Y, False)
CreateBall("Blue", PARectC2.X, PARectC2.Y, False)
CreateBall("Blue", PARectD2.X, PARectD2.Y, False)
CreateBall("Blue", PARectG2.X, PARectG2.Y, False)
CreateBall("Blue", PARectH2.X, PARectH2.Y, False)
CreateBall("Blue", PARectI2.X, PARectI2.Y, False)
CreateBall("Blue", PARectJ2.X, PARectJ2.Y, False)
CreateBall("Black", PARectA3.X, PARectA3.Y, False)
CreateBall("Black", PARectB3.X, PARectB3.Y, False)
CreateBall("Black", PARectD3.X, PARectD3.Y, False)
CreateBall("Black", PARectG3.X, PARectG3.Y, False)
CreateBall("Black", PARectI3.X, PARectI3.Y, False)
CreateBall("Black", PARectJ3.X, PARectJ3.Y, False)
CreateBall("Yellow", PARectA4.X, PARectA4.Y, False)
CreateBall("Yellow", PARectB4.X, PARectB4.Y, False)
CreateBall("Yellow", PARectD4.X, PARectD4.Y, False)
CreateBall("Yellow", PARectG4.X, PARectG4.Y, False)
CreateBall("Yellow", PARectI4.X, PARectI4.Y, False)
CreateBall("Yellow", PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall("Green", PARectD5.X, PARectD5.Y, False)
CreateBall("Green", PARectE5.X, PARectE5.Y, False)
CreateBall("Green", PARectF5.X, PARectF5.Y, False)
CreateBall("Green", PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall("Green", PARectE6.X, PARectE6.Y, False)
CreateBall("Green", PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
Case Is = 7 'Level 7
CreateBall("Black", PARectA1.X, PARectA1.Y, False)
CreateBall("Black", PARectB1.X, PARectB1.Y, False)
CreateBall("Black", PARectC1.X, PARectC1.Y, False)
CreateBall("Blue", PARectD1.X, PARectD1.Y, False)
CreateBall("Blue", PARectE1.X, PARectE1.Y, False)
CreateBall("Blue", PARectF1.X, PARectF1.Y, False)
CreateBall("Blue", PARectG1.X, PARectG1.Y, False)
CreateBall("Blue", PARectH1.X, PARectH1.Y, False)
CreateBall("Blue", PARectI1.X, PARectI1.Y, False)
CreateBall("Black", PARectJ1.X, PARectJ1.Y, False)
CreateBall("Blue", PARectA2.X, PARectA2.Y, False)
CreateBall("Blue", PARectB2.X, PARectB2.Y, False)
CreateBall("Blue", PARectC2.X, PARectC2.Y, False)
CreateBall("Yellow", PARectD2.X, PARectD2.Y, False)
CreateBall("Yellow", PARectE2.X, PARectE2.Y, False)
CreateBall("Yellow", PARectF2.X, PARectF2.Y, False)
CreateBall("Yellow", PARectG2.X, PARectG2.Y, False)
CreateBall("Yellow", PARectH2.X, PARectH2.Y, False)
CreateBall("Black", PARectI2.X, PARectI2.Y, False)
CreateBall("Yellow", PARectA3.X, PARectA3.Y, False)
CreateBall("Yellow", PARectB3.X, PARectB3.Y, False)
CreateBall("Yellow", PARectC3.X, PARectC3.Y, False)
CreateBall("Green", PARectD3.X, PARectD3.Y, False)
CreateBall("Green", PARectE3.X, PARectE3.Y, False)
CreateBall("Green", PARectF3.X, PARectF3.Y, False)
CreateBall("Green", PARectG3.X, PARectG3.Y, False)
CreateBall("Blue", PARectH3.X, PARectH3.Y, False)
CreateBall("Red", PARectA4.X, PARectA4.Y, False)
CreateBall("Red", PARectB4.X, PARectB4.Y, False)
CreateBall("Red", PARectC4.X, PARectC4.Y, False)
CreateBall("Red", PARectD4.X, PARectD4.Y, False)
CreateBall("Red", PARectE4.X, PARectE4.Y, False)
CreateBall("Red", PARectF4.X, PARectF4.Y, False)
CreateBall("Blue", PARectG4.X, PARectG4.Y, False)
CreateBall("Green", PARectA5.X, PARectA5.Y, False)
CreateBall("Green", PARectB5.X, PARectB5.Y, False)
CreateBall("Green", PARectC5.X, PARectC5.Y, False)
CreateBall("Green", PARectD5.X, PARectD5.Y, False)
CreateBall("Green", PARectE5.X, PARectE5.Y, False)
CreateBall("Yellow", PARectF5.X, PARectF5.Y, False)
CreateBall("Black", PARectA6.X, PARectA6.Y, False)
CreateBall("Black", PARectB6.X, PARectB6.Y, False)
CreateBall("Black", PARectC6.X, PARectC6.Y, False)
CreateBall("Black", PARectD6.X, PARectD6.Y, False)
CreateBall("Green", PARectE6.X, PARectE6.Y, False)
CreateBall("Blue", PARectA7.X, PARectA7.Y, False)
CreateBall("Blue", PARectB7.X, PARectB7.Y, False)
CreateBall("Blue", PARectC7.X, PARectC7.Y, False)
CreateBall("Green", PARectD7.X, PARectD7.Y, False)
CreateBall("Yellow", PARectA8.X, PARectA8.Y, False)
CreateBall("Yellow", PARectB8.X, PARectB8.Y, False)
CreateBall("Green", PARectC8.X, PARectC8.Y, False)
CreateBall("Red", PARectA9.X, PARectA9.Y, False)
CreateBall("Red", PARectB9.X, PARectB9.Y, False)
CreateBall("Red", PARectA10.X, PARectA10.Y, False)
Case Is = 8 'Level 8
CreateBall("Red", PARectA1.X, PARectA1.Y, False)
CreateBall("Red", PARectB1.X, PARectB1.Y, False)
CreateBall("Blue", PARectE1.X, PARectE1.Y, False)
CreateBall("Blue", PARectF1.X, PARectF1.Y, False)
CreateBall("Green", PARectI1.X, PARectI1.Y, False)
CreateBall("Green", PARectJ1.X, PARectJ1.Y, False)
CreateBall("Red", PARectA2.X, PARectA2.Y, False)
CreateBall("Red", PARectB2.X, PARectB2.Y, False)
CreateBall("Blue", PARectE2.X, PARectE2.Y, False)
CreateBall("Blue", PARectF2.X, PARectF2.Y, False)
CreateBall("Green", PARectI2.X, PARectI2.Y, False)
CreateBall("Green", PARectJ2.X, PARectJ2.Y, False)
CreateBall("Black", PARectB3.X, PARectB3.Y, False)
CreateBall("Yellow", PARectC3.X, PARectC3.Y, False)
CreateBall("Yellow", PARectD3.X, PARectD3.Y, False)
CreateBall("Black", PARectG3.X, PARectG3.Y, False)
CreateBall("Black", PARectH3.X, PARectH3.Y, False)
CreateBall("Yellow", PARectI3.X, PARectI3.Y, False)
CreateBall("Yellow", PARectC4.X, PARectC4.Y, False)
CreateBall("Yellow", PARectD4.X, PARectD4.Y, False)
CreateBall("Black", PARectG4.X, PARectG4.Y, False)
CreateBall("Black", PARectH4.X, PARectH4.Y, False)
CreateBall("Green", PARectA5.X, PARectA5.Y, False)
CreateBall("Green", PARectB5.X, PARectB5.Y, False)
CreateBall("Blue", PARectC5.X, PARectC5.Y, False)
CreateBall("Red", PARectD5.X, PARectD5.Y, False)
CreateBall("Red", PARectE5.X, PARectE5.Y, False)
CreateBall("Red", PARectF5.X, PARectF5.Y, False)
CreateBall("Red", PARectG5.X, PARectG5.Y, False)
CreateBall("Green", PARectH5.X, PARectH5.Y, False)
CreateBall("Blue", PARectI5.X, PARectI5.Y, False)
CreateBall("Blue", PARectJ5.X, PARectJ5.Y, False)
CreateBall("Green", PARectA6.X, PARectA6.Y, False)
CreateBall("Green", PARectB6.X, PARectB6.Y, False)
CreateBall("Red", PARectE6.X, PARectE6.Y, False)
CreateBall("Red", PARectF6.X, PARectF6.Y, False)
CreateBall("Blue", PARectI6.X, PARectI6.Y, False)
CreateBall("Blue", PARectJ6.X, PARectJ6.Y, False)
CreateBall("Black", PARectB7.X, PARectB7.Y, False)
CreateBall("Red", PARectC7.X, PARectC7.Y, False)
CreateBall("Blue", PARectD7.X, PARectD7.Y, False)
CreateBall("Blue", PARectG7.X, PARectG7.Y, False)
CreateBall("Green", PARectH7.X, PARectH7.Y, False)
CreateBall("Black", PARectI7.X, PARectI7.Y, False)
CreateBall("Green", PARectC8.X, PARectC8.Y, False)
CreateBall("Red", PARectD8.X, PARectD8.Y, False)
CreateBall("Red", PARectG8.X, PARectG8.Y, False)
CreateBall("Blue", PARectH8.X, PARectH8.Y, False)
CreateBall("Yellow", PARectA9.X, PARectA9.Y, False)
CreateBall("Yellow", PARectB9.X, PARectB9.Y, False)
CreateBall("Black", PARectC9.X, PARectC9.Y, False)
CreateBall("Yellow", PARectH9.X, PARectH9.Y, False)
CreateBall("Black", PARectI9.X, PARectI9.Y, False)
CreateBall("Black", PARectJ9.X, PARectJ9.Y, False)
CreateBall(GetRandomColour(), PARectA10.X, PARectA10.Y, False)
CreateBall(GetRandomColour(), PARectB10.X, PARectB10.Y, False)
CreateBall(GetRandomColour(), PARectI10.X, PARectI10.Y, False)
CreateBall(GetRandomColour(), PARectJ10.X, PARectJ10.Y, False)
Case Is = 9 ' Level 9
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectB2.X, PARectB2.Y, False)
CreateBall(GetRandomColour(), PARectC2.X, PARectC2.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectH2.X, PARectH2.Y, False)
CreateBall(GetRandomColour(), PARectI2.X, PARectI2.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectC4.X, PARectC4.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectH4.X, PARectH4.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectC6.X, PARectC6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectH6.X, PARectH6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectC8.X, PARectC8.Y, False)
CreateBall(GetRandomColour(), PARectH8.X, PARectH8.Y, False)
Case Is = 10 ' Level 10
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectC6.X, PARectC6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectH6.X, PARectH6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectE8.X, PARectE8.Y, False)
CreateBall(GetRandomColour(), PARectF8.X, PARectF8.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
CreateBall(GetRandomColour(), PARectA9.X, PARectA9.Y, False)
CreateBall(GetRandomColour(), PARectB9.X, PARectB9.Y, False)
CreateBall(GetRandomColour(), PARectC9.X, PARectC9.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectH9.X, PARectH9.Y, False)
CreateBall(GetRandomColour(), PARectI9.X, PARectI9.Y, False)
CreateBall(GetRandomColour(), PARectJ9.X, PARectJ9.Y, False)
Case Is = 11 ' Level 11
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall(GetRandomColour(), PARectC4.X, PARectC4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectH4.X, PARectH4.Y, False)
CreateBall(GetRandomColour(), PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectC6.X, PARectC6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectH6.X, PARectH6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectC8.X, PARectC8.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectE8.X, PARectE8.Y, False)
CreateBall(GetRandomColour(), PARectF8.X, PARectF8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectH8.X, PARectH8.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectA9.X, PARectA9.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
CreateBall(GetRandomColour(), PARectJ9.X, PARectJ9.Y, False)
Case Is = 12 ' Level 12
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectB3.X, PARectB3.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectI3.X, PARectI3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
CreateBall(GetRandomColour(), PARectA9.X, PARectA9.Y, False)
CreateBall(GetRandomColour(), PARectB9.X, PARectB9.Y, False)
CreateBall(GetRandomColour(), PARectC9.X, PARectC9.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectH9.X, PARectH9.Y, False)
CreateBall(GetRandomColour(), PARectI9.X, PARectI9.Y, False)
CreateBall(GetRandomColour(), PARectJ9.X, PARectJ9.Y, False)
Case Is = 13 ' Level 13
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectB2.X, PARectB2.Y, False)
CreateBall(GetRandomColour(), PARectC2.X, PARectC2.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectH2.X, PARectH2.Y, False)
CreateBall(GetRandomColour(), PARectI2.X, PARectI2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectB3.X, PARectB3.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectI3.X, PARectI3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall(GetRandomColour(), PARectC4.X, PARectC4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectH4.X, PARectH4.Y, False)
CreateBall(GetRandomColour(), PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectC6.X, PARectC6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectH6.X, PARectH6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectB8.X, PARectB8.Y, False)
CreateBall(GetRandomColour(), PARectC8.X, PARectC8.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectE8.X, PARectE8.Y, False)
CreateBall(GetRandomColour(), PARectF8.X, PARectF8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectH8.X, PARectH8.Y, False)
CreateBall(GetRandomColour(), PARectI8.X, PARectI8.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
CreateBall(GetRandomColour(), PARectA9.X, PARectA9.Y, False)
CreateBall(GetRandomColour(), PARectB9.X, PARectB9.Y, False)
CreateBall(GetRandomColour(), PARectC9.X, PARectC9.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectH9.X, PARectH9.Y, False)
CreateBall(GetRandomColour(), PARectI9.X, PARectI9.Y, False)
CreateBall(GetRandomColour(), PARectJ9.X, PARectJ9.Y, False)
Case Is = 14 ' Level 14
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectC6.X, PARectC6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectH6.X, PARectH6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectC8.X, PARectC8.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectE8.X, PARectE8.Y, False)
CreateBall(GetRandomColour(), PARectF8.X, PARectF8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectH8.X, PARectH8.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectE10.X, PARectE10.Y, False)
CreateBall(GetRandomColour(), PARectF10.X, PARectF10.Y, False)
Case Is = 15 ' Level 15
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectB2.X, PARectB2.Y, False)
CreateBall(GetRandomColour(), PARectC2.X, PARectC2.Y, False)
CreateBall(GetRandomColour(), PARectD2.X, PARectD2.Y, False)
CreateBall(GetRandomColour(), PARectE2.X, PARectE2.Y, False)
CreateBall(GetRandomColour(), PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectG2.X, PARectG2.Y, False)
CreateBall(GetRandomColour(), PARectH2.X, PARectH2.Y, False)
CreateBall(GetRandomColour(), PARectI2.X, PARectI2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectB3.X, PARectB3.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectI3.X, PARectI3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectB4.X, PARectB4.Y, False)
CreateBall(GetRandomColour(), PARectC4.X, PARectC4.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectH4.X, PARectH4.Y, False)
CreateBall(GetRandomColour(), PARectI4.X, PARectI4.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectB8.X, PARectB8.Y, False)
CreateBall(GetRandomColour(), PARectC8.X, PARectC8.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectH8.X, PARectH8.Y, False)
CreateBall(GetRandomColour(), PARectI8.X, PARectI8.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
CreateBall(GetRandomColour(), PARectA9.X, PARectA9.Y, False)
CreateBall(GetRandomColour(), PARectB9.X, PARectB9.Y, False)
CreateBall(GetRandomColour(), PARectC9.X, PARectC9.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectH9.X, PARectH9.Y, False)
CreateBall(GetRandomColour(), PARectI9.X, PARectI9.Y, False)
CreateBall(GetRandomColour(), PARectJ9.X, PARectJ9.Y, False)
Case Is = 16 ' Level 16
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectC1.X, PARectC1.Y, False)
CreateBall(GetRandomColour(), PARectD1.X, PARectD1.Y, False)
CreateBall(GetRandomColour(), PARectE1.X, PARectE1.Y, False)
CreateBall(GetRandomColour(), PARectF1.X, PARectF1.Y, False)
CreateBall(GetRandomColour(), PARectG1.X, PARectG1.Y, False)
CreateBall(GetRandomColour(), PARectH1.X, PARectH1.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectA3.X, PARectA3.Y, False)
CreateBall(GetRandomColour(), PARectB3.X, PARectB3.Y, False)
CreateBall(GetRandomColour(), PARectC3.X, PARectC3.Y, False)
CreateBall(GetRandomColour(), PARectD3.X, PARectD3.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectG3.X, PARectG3.Y, False)
CreateBall(GetRandomColour(), PARectH3.X, PARectH3.Y, False)
CreateBall(GetRandomColour(), PARectI3.X, PARectI3.Y, False)
CreateBall(GetRandomColour(), PARectJ3.X, PARectJ3.Y, False)
CreateBall(GetRandomColour(), PARectA4.X, PARectA4.Y, False)
CreateBall(GetRandomColour(), PARectJ4.X, PARectJ4.Y, False)
CreateBall(GetRandomColour(), PARectA5.X, PARectA5.Y, False)
CreateBall(GetRandomColour(), PARectB5.X, PARectB5.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectI5.X, PARectI5.Y, False)
CreateBall(GetRandomColour(), PARectJ5.X, PARectJ5.Y, False)
CreateBall(GetRandomColour(), PARectA6.X, PARectA6.Y, False)
CreateBall(GetRandomColour(), PARectJ6.X, PARectJ6.Y, False)
CreateBall(GetRandomColour(), PARectA7.X, PARectA7.Y, False)
CreateBall(GetRandomColour(), PARectB7.X, PARectB7.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectI7.X, PARectI7.Y, False)
CreateBall(GetRandomColour(), PARectJ7.X, PARectJ7.Y, False)
CreateBall(GetRandomColour(), PARectA8.X, PARectA8.Y, False)
CreateBall(GetRandomColour(), PARectJ8.X, PARectJ8.Y, False)
CreateBall(GetRandomColour(), PARectA9.X, PARectA9.Y, False)
CreateBall(GetRandomColour(), PARectB9.X, PARectB9.Y, False)
CreateBall(GetRandomColour(), PARectC9.X, PARectC9.Y, False)
CreateBall(GetRandomColour(), PARectD9.X, PARectD9.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
CreateBall(GetRandomColour(), PARectG9.X, PARectG9.Y, False)
CreateBall(GetRandomColour(), PARectH9.X, PARectH9.Y, False)
CreateBall(GetRandomColour(), PARectI9.X, PARectI9.Y, False)
CreateBall(GetRandomColour(), PARectJ9.X, PARectJ9.Y, False)
Case Is = 17 ' Level 17
CreateBall(GetRandomColour(), PARectA1.X, PARectA1.Y, False)
CreateBall(GetRandomColour(), PARectB1.X, PARectB1.Y, False)
CreateBall(GetRandomColour(), PARectA2.X, PARectA2.Y, False)
CreateBall(GetRandomColour(), PARectB2.X, PARectB2.Y, False)
CreateBall("Blue", PARectE1.X, PARectE1.Y, False)
CreateBall("Blue", PARectF1.X, PARectF1.Y, False)
CreateBall("Blue", PARectE2.X, PARectE2.Y, False)
CreateBall("Blue", PARectF2.X, PARectF2.Y, False)
CreateBall(GetRandomColour(), PARectI1.X, PARectI1.Y, False)
CreateBall(GetRandomColour(), PARectJ1.X, PARectJ1.Y, False)
CreateBall(GetRandomColour(), PARectI2.X, PARectI2.Y, False)
CreateBall(GetRandomColour(), PARectJ2.X, PARectJ2.Y, False)
CreateBall(GetRandomColour(), PARectE3.X, PARectE3.Y, False)
CreateBall(GetRandomColour(), PARectF3.X, PARectF3.Y, False)
CreateBall(GetRandomColour(), PARectD4.X, PARectD4.Y, False)
CreateBall(GetRandomColour(), PARectE4.X, PARectE4.Y, False)
CreateBall(GetRandomColour(), PARectF4.X, PARectF4.Y, False)
CreateBall(GetRandomColour(), PARectG4.X, PARectG4.Y, False)
CreateBall(GetRandomColour(), PARectC5.X, PARectC5.Y, False)
CreateBall(GetRandomColour(), PARectD5.X, PARectD5.Y, False)
CreateBall(GetRandomColour(), PARectE5.X, PARectE5.Y, False)
CreateBall(GetRandomColour(), PARectF5.X, PARectF5.Y, False)
CreateBall(GetRandomColour(), PARectG5.X, PARectG5.Y, False)
CreateBall(GetRandomColour(), PARectH5.X, PARectH5.Y, False)
CreateBall(GetRandomColour(), PARectB6.X, PARectB6.Y, False)
CreateBall(GetRandomColour(), PARectC6.X, PARectC6.Y, False)
CreateBall(GetRandomColour(), PARectD6.X, PARectD6.Y, False)
CreateBall(GetRandomColour(), PARectE6.X, PARectE6.Y, False)
CreateBall(GetRandomColour(), PARectF6.X, PARectF6.Y, False)
CreateBall(GetRandomColour(), PARectG6.X, PARectG6.Y, False)
CreateBall(GetRandomColour(), PARectH6.X, PARectH6.Y, False)
CreateBall(GetRandomColour(), PARectI6.X, PARectI6.Y, False)
CreateBall(GetRandomColour(), PARectC7.X, PARectC7.Y, False)
CreateBall(GetRandomColour(), PARectD7.X, PARectD7.Y, False)
CreateBall(GetRandomColour(), PARectE7.X, PARectE7.Y, False)
CreateBall(GetRandomColour(), PARectF7.X, PARectF7.Y, False)
CreateBall(GetRandomColour(), PARectG7.X, PARectG7.Y, False)
CreateBall(GetRandomColour(), PARectH7.X, PARectH7.Y, False)
CreateBall(GetRandomColour(), PARectD8.X, PARectD8.Y, False)
CreateBall(GetRandomColour(), PARectE8.X, PARectE8.Y, False)
CreateBall(GetRandomColour(), PARectF8.X, PARectF8.Y, False)
CreateBall(GetRandomColour(), PARectG8.X, PARectG8.Y, False)
CreateBall(GetRandomColour(), PARectE9.X, PARectE9.Y, False)
CreateBall(GetRandomColour(), PARectF9.X, PARectF9.Y, False)
End Select

End Sub

This sub creates a number of rectangles that cover the entire play area, it then creates balls in those rectangles, sometimes the colour is random and sometimes the colour is manually selected, as you can see these balls have their .IsInLauncher variable set to false and hence these balls will be involved in collisions. I had first intended to create 30 levels but after 17 i decided that would do, also note that the level is selected by the random number chosen in the previous function.

Right, thats it for the graphics module, next we have the writetext sub that i spoke of earlier, i wont show you the code because i have already written it in a previous tutorial , so I will now move on to the Ball class which has 2 new additions:


Public PointsAwarded As Boolean = False 'If true points have already been awarded for this ball
'100 points for balls that explode and 200 for balls that drop

This new declaration ensures that points are only awarded for each ball once. The other bit of new code is in the MoveBallLauncherBalls() Sub and is the previously mentioned change to the createball function:

CreateBall(GetRandomColour(), BallLauncherRect1.X, BallLauncherRect1.Y, True)

Because this ball is created in the balllauncher it has it's .IsInLauncher variable set to True, thats all for the ball class, the rest of the changes are in the Form1 code, of which we will start with KeyDown Sub:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

Select Case e.KeyCode
Case Is = Windows.Forms.Keys.Escape
Application.Exit()
Exit Sub
Case Is = Windows.Forms.Keys.Right

If GameState = "Playing" Then ' If a game is in progress
If ArrowSBRotate >= MathHelper.ToRadians(85) Then
ArrowSBRotate = MathHelper.ToRadians(85)
Exit Sub
End If
ArrowSBRotate = ArrowSBRotate + MathHelper.ToRadians(2)
End If

Case Is = Windows.Forms.Keys.Left

If GameState = "Playing" Then ' If a game is in progress
If ArrowSBRotate <= MathHelper.ToRadians(-85) Then
ArrowSBRotate = MathHelper.ToRadians(-85)
Exit Sub
End If
ArrowSBRotate = ArrowSBRotate - MathHelper.ToRadians(2)
End If

Case Is = Windows.Forms.Keys.Space

If GameState = "WaitingToStart" Then ' Game has not started yet
CurrentScore = 0 'Reset Current Score
CurrentLevel += 1 ' Increment Level Number
GameStopWatch.Reset() 'Reset the Stopwatch
GameStopWatch.Start() ' Start the stopwatch
PlayAreaRect.Y = 62
PlayAreaRect.Height = 456
PlayAreaRect.Width = 380
SetBallLauncherBalls()
PlayAreaTex = Texture2D.FromFile(Device, "../../images/380x480AlphaChannelOnly.png", NonBallTexCreationParams)
GameState = "Loading" 'Load a Level

ElseIf GameState = "Playing" Then ' If a game is in progress

If ABallHasBeenLaunched = False Then ' If a ball is not already moving
If ABallNeedsPositionedCorrectly = False Then
For Each SingleBall As Ball In BallsArray ' Check every ball in the array
If SingleBall.IsDeleted = False Then
If SingleBall.BallRect = BallLauncherRect7 Then ' If ball is in the launch position
If SingleBall.IsMoving = False Then
GetBallVectorFromArrow() ' Get direction of arrow
End If
BallLauncherRect7IsEmpty = True
ANewBallIsNeeded = True
SingleBall.IsMoving = True
SingleBall.IsInLauncher = False
ABallHasBeenLaunched = True
Exit For ' because only one ball will be in the launch position we can safely exit the
'for loop after we have found it

End If
End If
Next
End If
End If
End If

Case Is = Keys.Pause
If GameState = "Playing" Then ' If a game is in progress
GameState = "Paused"
GameStopWatch.Reset()
GameStopWatch.Start()
ElseIf GameState = "Paused" Then ' If a game is in Paused
GameState = "Playing"
GameStopWatch.Reset()
GameStopWatch.Start()
End If
End Select

End Sub

The GameState Variable is used here, only when the game is playing can the arrow be moved. A new sub for the pause button is also added allowing the user to pause and unpause the game by changing the gamestate value from "Paused" to "Playing" and back again. Two new Variables have been added to the Form1 code, i could have put them in the module, it doesn't really matter:

Private MakeWriteTextOnlyRunOnTheFirstRenderLoop As Integer = 0 'Used to make sure that the WriteText Sub runs once during Game load - Render Loop
Private MakeLoadLevelOnlryRunOnTheFirstRenderLoop As Integer = 0 ' USed to make sure that LoadLevel only runs once per loop

I have also made a change to the InitializeGraphics() Sub:

Private Function IntializeGraphics()

Try
Dim presentParams As New PresentationParameters
presentParams.SwapEffect = SwapEffect.Discard
Dim XNAGraphicsAdapater As Microsoft.Xna.Framework.Graphics.GraphicsAdapter = Graphics.GraphicsAdapter.Adapters.Item(0)
Device = New Graphics.GraphicsDevice(XNAGraphicsAdapater, DeviceType.Hardware, Me.Handle, CreateOptions.SoftwareVertexProcessing, presentParams)
AddHandler Device.DeviceReset, AddressOf OnDeviceReset

Return True

Catch ex As Exception

Return False
End Try

End Function

This new code correctly implements the OnDeviceReset Sub which regains control of the device should it be lost. The Form1_Load sub also has a new addition:

'Setup the Text bitmaps that are static and wont change during the game
WriteText("Loading", "Mirror", 26, FontStyle.Bold, Brushes.Black, _
320, 300, LoadingTexture, LoadingVector

This simply creates the loading bitmap that is displayed when the levels are loading. Lastly we have the render sub which is where all the new components are called:

Private Sub Render()

'Make sure the Device is not lost
If Device.GraphicsDeviceStatus = GraphicsDeviceStatus.Normal Then
'Clear the backbuffer to a blue color
Device.Clear(ClearOptions.Target, Color.Blue, 1.0F, 0)

'Draw all Non Ball Textures
MainSB.Begin(SpriteBlendMode.AlphaBlend)
Select Case GameState

'--------------------------------------------------------------------------------
' GameState Change
'--------------------------------------------------------------------------------

Case Is = "WaitingToStart"

MainSB.Draw(BackgroundTex, BackgroundRect, Color.White)
MainSB.Draw(PlayAreaTex, PlayAreaRect, Color.White)

If CurrentScore > TempScore Or MakeWriteTextOnlyRunOnTheFirstRenderLoop = 0 Then
MakeWriteTextOnlyRunOnTheFirstRenderLoop += 1
WriteText("High Score" & vbCrLf & HighScore, "Mirror", 16, FontStyle.Bold, Brushes.SlateGray, _
630, PlayAreaRect.Y - 8, ScoreTexture, ScoreVector)
End If

MainSB.Draw(ScoreTexture, ScoreVector, Color.White)

'--------------------------------------------------------------------------------
' GameState Change
'--------------------------------------------------------------------------------

Case Is = "Loading"

If MakeLoadLevelOnlryRunOnTheFirstRenderLoop = 0 Then
CheckParticlesArray()
PlayAreaRect.Y = 60
RoofRect.Y = PlayAreaRect.Y - 380
LoadLevel() ' Load a random level
CurrentLevel += 1 ' Increment Level Number
MakeLoadLevelOnlryRunOnTheFirstRenderLoop += 1
End If

'Draw Ball
If UBound(BallsArray) > 0 Then
For Each SingleBall As Ball In BallsArray ' Check every ball in array
If SingleBall.IsDeleted = False Then
MainSB.Draw(SingleBall.BallTex, SingleBall.BallRect, Color.White) 'Draw Each Ball
End If
Next
End If

MainSB.Draw(BackgroundTex, BackgroundRect, Color.White)
MainSB.Draw(PlayAreaTex, PlayAreaRect, Color.White)
MainSB.Draw(BallLauncherTex, BallLauncherRect, Color.White)

'Draw Arrow - Arrow is drawn after ball so that it appears on top of ball.
'Anything drawn last will appear above anything drawn before

MainSB.Draw(ArrowTex, New Vector2(405, 485), Nothing, Color.White, ArrowSBRotate, _
New Vector2((ArrowTex.Width / 2), (ArrowTex.Height / 2)), 1.0F, SpriteEffects.None, 0.0F)

If CurrentScore <> TempScore Or MakeWriteTextOnlyRunOnTheFirstRenderLoop < 2 Then
MakeWriteTextOnlyRunOnTheFirstRenderLoop += 1
WriteText("High Score" & vbCrLf & HighScore & vbCrLf & vbCrLf & _
"Score" & vbCrLf & CurrentScore, "Mirror", 16, FontStyle.Bold, Brushes.SlateGray, _
630, PlayAreaRect.Y - 8, ScoreTexture, ScoreVector)
End If

'Write Score on Screen
MainSB.Draw(ScoreTexture, ScoreVector, Color.White)

'Draw the loading Text
If GameStopWatch.ElapsedMilliseconds < 1000 Then
MainSB.Draw(LoadingTexture, LoadingVector, Color.White)
End If

'Set the Countdown Text
Select Case GameStopWatch.ElapsedMilliseconds
Case 1000 To 1999
MainSB.Draw(Number3Tex, CountDownRect, Color.White)
Case 2000 To 2999
MainSB.Draw(Number2Tex, CountDownRect, Color.White)
Case 3000 To 3999
MainSB.Draw(Number1Tex, CountDownRect, Color.White)
Case 4000 To 4999
MainSB.Draw(LetsGoTex, LetsGoRect, Color.White)
Case Is > 5000
GameState = "Playing" 'Change GameState to Playing
MakeLoadLevelOnlryRunOnTheFirstRenderLoop = 0
GameStopWatch.Reset()
GameStopWatch.Start()
End Select

'--------------------------------------------------------------------------------
' GameState Change
'--------------------------------------------------------------------------------

Case Is = "Playing"

'Draw Ball
If UBound(BallsArray) > 0 Then
For Each SingleBall As Ball In BallsArray ' Check every ball in array
If SingleBall.IsDeleted = False Then
MainSB.Draw(SingleBall.BallTex, SingleBall.BallRect, Color.White) 'Draw Each Ball
End If
If SingleBall.IsMoving = True Then 'If a ball is set to move
SingleBall.MoveBall() 'Move the ball
End If
If BallLauncherRect7IsEmpty = True Then ' BallLauncherRect7IsEmpty is Set to True when a ball is launched
SingleBall.MoveBallLauncherBalls() ' Move the balls in the ball launcher
End If
If SingleBall.MarkedForDeletionDrop = True Then 'If a Ball is to be dropped
SingleBall.BallRect.Y += SingleBall.BallXVel 'Move the ball down at speed BallXVel
SingleBall.BallXVel += 0.5 'increase BallXVel to give appearance of gravity
'Award points if PointsAwarded = False
If SingleBall.PointsAwarded = False Then
CurrentScore += 200
SingleBall.PointsAwarded = True
End If
SingleBall.IsDropped = True 'Variable to exclude ball fromm Collison
'If it moves below the playarea then delete it
If SingleBall.BallRect.Y > PlayAreaRect.Bottom Then
SingleBall.IsDeleted = True
BallsNeedRemoved = True
End If
End If
Next

If ABallHasBeenLaunched = True Then ' A global variable used to tell the program when to start checking for
If UBound(BallsArray) > 1 Then ' collisions
CheckForCollision() ' Check for a collision
End If
End If

'If a Ball needs to be positioned correctly
If ABallNeedsPositionedCorrectly = True Then
If UBound(BallsArray) > 1 Then
'Correctly Position Ball
PositionBallCorrectly()
End If
End If

'Check for 3 touching Balls
If ShouldWeCheckFor3TouchingBalls = True Then
If CheckFor3TouchingBalls() = True Then
FindTheBallsToRemove()
End If
End If

'If BallsNeedRemoved = True then Run the RemoveBalls Sub
If BallsNeedRemoved = True Then
RemoveBalls() ' Find those balls tha have MarkedForDeletionExplode = Fasle, then set IsDeleted = True
RedimBallArray() ' Remove those Balls that have IsDeleted = True from the Array
FindBallsToDrop() ' Find which Balls should fall out the game, as they are no longer connected to the top of the playarea
End If

'Animate Particles if there are any
If UBound(ParticlesArray) > 0 Then
For Each TempPart As Particle In ParticlesArray
MainSB.Draw(TempPart.ParticleTex, TempPart.ParticleRect, Color.White) 'Draw Each Particle
MoveParticle(TempPart) 'Move each particle
Next
End If

'Remove any Deleted Particles
If TheParticelArrayNeedsRedimmed = True AndAlso UBound(ParticlesArray) > 10 Then
CheckParticlesArray()
End If

End If

'If the number of balls = 7 then all balls have exploded or dropped and the game is won
If UBound(BallsArray) < 7 Then
GameStopWatch.Reset()
GameStopWatch.Start()
GameState = "GameWon"
End If

'Check for GameLost - If a ball goes lower than BallLauncherRect7.Y
If UBound(BallsArray) > 6 Then
For Each TempBall As Ball In BallsArray
If TempBall.IsDeleted = False Then
If TempBall.IsDropped = False Then
If TempBall.IsInLauncher = False Then
If TempBall.IsMoving = False Then
If TempBall.MarkedForDeletionDrop = False Then
If TempBall.MarkedForDeletionExplode = False Then
If TempBall.BallRect.Y > 430 Then
GameStopWatch.Reset()
GameStopWatch.Start()
GameState = "GameLost"
End If
End If
End If
End If
End If
End If
End If
Next
End If

'Draw Roof and other Textures
MainSB.Draw(RoofTex, RoofRect, Color.White)

'lower roof and playarea and balls
If GameStopWatch.ElapsedMilliseconds > RoofLowerAfter Then
GameStopWatch.Reset()
GameStopWatch.Start()
RoofRect.Y += 5
PlayAreaRect.Y += 5
If UBound(BallsArray) > 6 Then
For Each TempBall As Ball In BallsArray
If TempBall.IsDeleted = False Then
If TempBall.IsDropped = False Then
If TempBall.IsInLauncher = False Then
If TempBall.MarkedForDeletionDrop = False Then
If TempBall.MarkedForDeletionExplode = False Then
TempBall.BallRect.Y += 5
End If
End If
End If
End If
End If
Next
End If
End If

MainSB.Draw(BackgroundTex, BackgroundRect, Color.White)
MainSB.Draw(PlayAreaTex, PlayAreaRect, Color.White)
MainSB.Draw(BallLauncherTex, BallLauncherRect, Color.White)

'Draw Arrow - Arrow is drawn after ball so that it appears on top of ball.
'Anything drawn last will appear above anything drawn before

MainSB.Draw(ArrowTex, New Vector2(405, 485), Nothing, Color.White, ArrowSBRotate, _
New Vector2((ArrowTex.Width / 2), (ArrowTex.Height / 2)), 1.0F, SpriteEffects.None, 0.0F)

'Write Score on the Screen
If HighScore < CurrentScore Then
HighScore = CurrentScore
End If

'The WriteText sub uses about 30% CPU time, so this If statement tells it to run only if
'the score has changed.

If CurrentScore > TempScore Or MakeWriteTextOnlyRunOnTheFirstRenderLoop = 0 Then
MakeWriteTextOnlyRunOnTheFirstRenderLoop += 1
WriteText("High Score" & vbCrLf & HighScore & vbCrLf & vbCrLf & _
"Score" & vbCrLf & CurrentScore, "Mirror", 16, FontStyle.Bold, Brushes.SlateGray, _
630, 52, ScoreTexture, ScoreVector)
End If

TempScore = CurrentScore 'hold score in a temporary variable to see if it changes on next loop
MainSB.Draw(ScoreTexture, ScoreVector, Color.White)

'--------------------------------------------------------------------------------
' GameState Change
'--------------------------------------------------------------------------------

Case Is = "Paused"

'Draw Ball
If UBound(BallsArray) > 0 Then
For Each SingleBall As Ball In BallsArray ' Check every ball in array
If SingleBall.IsDeleted = False Then
MainSB.Draw(SingleBall.BallTex, SingleBall.BallRect, Color.White) 'Draw Each Ball
End If
Next
End If

'Animate Particles if there are any
If UBound(ParticlesArray) > 0 Then
For Each TempPart As Particle In ParticlesArray
MainSB.Draw(TempPart.ParticleTex, TempPart.ParticleRect, Color.White) 'Draw Each Particle
Next
End If

'Draw Roof and other Textures
MainSB.Draw(RoofTex, RoofRect, Color.White)
MainSB.Draw(BackgroundTex, BackgroundRect, Color.White)
MainSB.Draw(PlayAreaTex, PlayAreaRect, Color.White)
MainSB.Draw(BallLauncherTex, BallLauncherRect, Color.White)

'Draw Arrow - Arrow is drawn after ball so that it appears on top of ball.
'Anything drawn last will appear above anything drawn before

MainSB.Draw(ArrowTex, New Vector2(405, 485), Nothing, Color.White, ArrowSBRotate, _
New Vector2((ArrowTex.Width / 2), (ArrowTex.Height / 2)), 1.0F, SpriteEffects.None, 0.0F)

MainSB.Draw(ScoreTexture, ScoreVector, Color.White)

'Draw the Paused Text
If GameStopWatch.ElapsedMilliseconds < 500 Then
MainSB.Draw(PauseTex, PauseRect, Color.White)
ElseIf GameStopWatch.ElapsedMilliseconds > 1000 Then
GameStopWatch.Reset()
GameStopWatch.Start()
End If

'--------------------------------------------------------------------------------
' GameState Change
'--------------------------------------------------------------------------------

Case Is = "GameWon"

'Draw Ball
If UBound(BallsArray) > 0 Then
For Each SingleBall As Ball In BallsArray ' Check every ball in array
If SingleBall.IsDeleted = False Then
MainSB.Draw(SingleBall.BallTex, SingleBall.BallRect, Color.White) 'Draw Each Ball
End If
Next
End If

'Animate Particles if there are any
If UBound(ParticlesArray) > 0 Then
For Each TempPart As Particle In ParticlesArray
MainSB.Draw(TempPart.ParticleTex, TempPart.ParticleRect, Color.White) 'Draw Each Particle
MoveParticle(TempPart) 'Move each particle
Next
End If

MainSB.Draw(BackgroundTex, BackgroundRect, Color.White)
MainSB.Draw(PlayAreaTex, PlayAreaRect, Color.White)
MainSB.Draw(BallLauncherTex, BallLauncherRect, Color.White)

'Draw Arrow - Arrow is drawn after ball so that it appears on top of ball.
'Anything drawn last will appear above anything drawn before

MainSB.Draw(ArrowTex, New Vector2(405, 485), Nothing, Color.White, ArrowSBRotate, _
New Vector2((ArrowTex.Width / 2), (ArrowTex.Height / 2)), 1.0F, SpriteEffects.None, 0.0F)

MainSB.Draw(CongratTex, CongratRect, Color.White)

'Check for the passage of time
If GameStopWatch.ElapsedMilliseconds > 1500 Then
GameStopWatch.Reset()
GameStopWatch.Start()
GameState = "Loading"
RoofLowerAfter -= 250
If RoofLowerAfter < 2000 Then
RoofLowerAfter = 2000
End If
CurrentLevel += 1
End If

'--------------------------------------------------------------------------------
' GameState Change
'--------------------------------------------------------------------------------

Case Is = "GameLost"
RoofLowerAfter = 4000

'Draw Ball
If UBound(BallsArray) > 0 Then
For Each SingleBall As Ball In BallsArray ' Check every ball in array
If SingleBall.IsDeleted = False Then
If SingleBall.IsDropped = False Then
MainSB.Draw(SingleBall.BallTex, SingleBall.BallRect, Color.White) 'Draw Each Ball
End If
End If
Next
End If

'Set each ball to Explode
If UBound(BallsArray) > 0 Then
For Each SingleBall As Ball In BallsArray ' Check every ball in array
If SingleBall.IsInLauncher = False Then
If SingleBall.MarkedForDeletionExplode = False Then
SingleBall.MarkedForDeletionExplode = True
End If
End If
Next
BallsNeedRemoved = True
End If

'Animate Particles if there are any
If UBound(ParticlesArray) > 0 Then
For Each TempPart As Particle In ParticlesArray
MainSB.Draw(TempPart.ParticleTex, TempPart.ParticleRect, Color.White) 'Draw Each Particle
MoveParticle(TempPart) 'Move each particle
Next
End If

'Remove any Deleted Particles
If TheParticelArrayNeedsRedimmed = True AndAlso UBound(ParticlesArray) > 10 Then
CheckParticlesArray()
End If

'If BallsNeedRemoved = True then Run the RemoveBalls Sub
If BallsNeedRemoved = True Then
RemoveBalls() ' Find those balls tha have MarkedForDeletionExplode = Fasle, then set IsDeleted = True
RedimBallArray() ' Remove those Balls that have IsDeleted = True from the Array
End If

'Draw Non ball stuff
MainSB.Draw(RoofTex, RoofRect, Color.White)
MainSB.Draw(BackgroundTex, BackgroundRect, Color.White)
MainSB.Draw(PlayAreaTex, PlayAreaRect, Color.White)
MainSB.Draw(BallLauncherTex, BallLauncherRect, Color.White)
MainSB.Draw(GameOverTex, GameOverRect, Color.White)

'Draw Arrow - Arrow is drawn after ball so that it appears on top of ball.
'Anything drawn last will appear above anything drawn before

MainSB.Draw(ArrowTex, New Vector2(405, 485), Nothing, Color.White, ArrowSBRotate, _
New Vector2((ArrowTex.Width / 2), (ArrowTe