Basic Particle System in Visual Basic 6

Particle Systems in a game or any type of application adds a great
special effect. From spell casting in a game to wind movement studies,
particles can be complex or basic, and will still look great. Each
particle has a X velocity and a Y velocity other variables can be added
to hold data, like maybe if you were showing the movement of when the
particles have gravity, you may want to add mass of the particle.

To begin, we need to make a User Defined Type (UDT) with the properties for each particle.

1. Private Type Ptype
2.   X as long
3.   Y as long
4.   Xv as long
5.   Yv as long
6.   LifeSpan as long
7. End Type

• X & Y - The two variables to hold the position of the particle for plotting on the form/display.
• Xv & Yv - The two velocities of the particle.
• LifeSpan - How long the particle will last until it is reset at the beginning point.
Now we need to add the other variables for when we need them later.

1. Const Max  =  250
2. Dim Particle(Max) as Ptype
3. Dim bRunning as boolean
4. Dim Xstart as long, Ystart as long
5. Dim i as long

• Const Max = 250 - This line can be change to add more or make less particles to draw.
• Dim Particle(Max) as Ptype - Dim an array of particles to hold each particle's properties.
• Dim bRunning as boolean -This Boolean (ether equals True
or False) will tell the loop of the particle system to stop if the
program is trying to shutdown.
• Dim Xstart as long, Ystart as long -These two variables are to hold the starting position of a reset particle.
• Dim i as long - This variable is for the For Next loop to
go through every particle to change the particle's position on the
form/display using the particle's velocity.
Now when the form loads we want to set the properties of each particle.

2.   Show
3.
4.   Xstart =  ScaleWidth  2
5.   Ystart = ScaleHeight  2
6.   For i = 0 To Max
7.     Particle(i).LifeSpan = Rnd * 500
8.     Particle(i).X = Xstart
9.     Particle(i).Y = Ystart
10.     Particle(i).Yv = Rnd * -15
11.     Particle(i).Xv = Rnd * -10 + 5
12.   Next i
13.   bRunning =  True
14.   ParticleLoop
15. End Sub

• Show - This will make the form appear on screen.
• Xstart = ScaleWidth 2 & Ystart = ScaleHeight 2 -This sets the starting position for the reset particles.
• For I = 0 To Max -Begin to go through each particle and set the default properties.
• Particle(i).LifeSpan = Rnd * 500 - Create a random life span for the particle.
• Particle(i).X = Xstart & Particle(I).Y = Ystart -Sets the particle to the starting position.
• Particle(i).Yv = Rnd * -15 -Sets a random value between 0
and -15 for the Y velocity of the particle. (You can play around with
this line to get differ results on the characteristics of the particles
when they first come alive)
• Particle(i).Xv = Rnd * -10 + 5 - Sets a random value between -5 and 5 for the X velocity of the particle.
• (You can play around with this line to get differ results on the characteristics of the particles when they first come alive)
• bRunning = True - The Program has just finished setting the properties of the particles and is ready to run the loop
• ParticleLoop -Call the sub with the particle system loop

Now it is time to start the main part of a particle system is the
update loop to update each particle and to draw it on the form/display.

1. Private Sub ParticleLoop()
2.   Do While bRunning
3.     DoEvents
4.     For i = 0 To Max
5.       PSet (Particle(i).X, Particle(i).Y), BackColor
6.       Particle(i).X = Particle(i).X + Particle(i).Xv
7.       Particle(i).Y = Particle(i).Y + Particle(i).Yv
8.       Particle(i).Yv = Particle(I).Yv + 0.96
9.       If Particle(i).Y >= ScaleHeight Then
10.         Particle(i).Yv = -(Particle(I).Yv * 0.46)
11.         Particle(i).Y =  ScaleHeight
12.       End If
13.       Particle(i).LifeSpan = Particle(i).LifeSpan - 1
14.       If Particle(i).LifeSpan <= 0 Then
15.         Particle(i).LifeSpan = Rnd * 500
16.         Particle(i).X = Xstart
17.         Particle(i).Y = Ystart
18.         Particle(i).Yv = Rnd * -15
19.         Particle(i).Xv = Rnd * -10 + 5
20.       End If
21.       PSet (Particle(i).X, Particle(i).Y), RGB(0, 0, 0)
22.     Next i
23.     Refresh
24.   Loop
25. End Sub

• Do While bRunning -This line is to start the loop of updating the particles
• DoEvents -You always want to add this in a long lasting loop. It tells windows to do outside events. Basically, everything won’t “freeze" or run very slow.
• For i = 0 To Max -begin to start going through each particle in the array.
• PSet (Particle(i).X, Particle(i).Y), BackColor -Erases the last spot were the particle was, by matching the form's back color.
• Particle(i).X = Particle(i).X + Particle(i).Xv -Updates the particle's x position by adding its X velocity.
• Particle(i).Y = Particle(i).Y + Particle(i).Yv -Updates the particle's y position by adding its Y velocity.
• Particle(i).Yv = Particle(i).Yv + 0.96 -This adds gravity to the particle's Y velocity. (You can play around with this line to get differ results on the characteristics of the particles.)
• If Particle(i).Y >= ScaleHeight Then - If the Particle is equal to or greater then the form's height then. basically, if the particle hits the bottom of the form then
• Particle(i).Yv = -(Particle(i).Yv * 0.46) - This adds a bounce effect to the particle when it hits the bottom of the form by making the particle's Y velocity opposite and making it 46% less. (You can play around with this line to get differ results on the characteristics of the 'bounce' on the particles.)

• Particle(i).LifeSpan = Particle(I).Life – 1 - Subtract one life from the particle.
• If Particle(i).LifeSpan <= 0 Then - If the life span is equal to or less than 0 then. basically, If the particle as run out of life then
• Particle(i).LifeSpan = Rnd * 500 - Create a random life span for the particle.
• Particle(i).X = Xstart & Particle(I).Y = Ystart -Sets the particle to the starting position.
• Particle(i).Yv = Rnd * -15 - Sets a random value between 0 and -15 for the Y velocity of the particle. (You can play around with this line to get differ results on the characteristics of the particles after running the first time.)
• Particle(i).Xv = Rnd * -10 + 5 - Sets a random value between -5 and 5 for the X velocity of the particle.  (You can play around with this line to get differ results on the characteristics of the particles after running the first time.)
• PSet (Particle(i).X, Particle(i).Y), RGB(0, 0, 0) - This will draw the particle on the form/display at the color of black. (You can play around with this line to get differ results on the color of the particles.)
• Next I - Goes to next particle and updates it.
• Refresh - Refresh the form.
• Loop - Go back to the being of the loop
Now all we need is the code to close the program.

1. Private Sub Form_Unload(Cancel As Integer)
2.     bRunning = False
3. End Sub

• bRunning = False - Stops the loop from continuing.
Complete Code:

1. Private Type Ptype
2.   X as long
3.   Y as long
4.   Xv as long
5.   Yv as long
6.   LifeSpan as long
7. End Type
8. Const Max  =  250
9. Dim Particle(Max) as Ptype
10. Dim bRunning as boolean
11. Dim Xstart as long, Ystart as long
12. Dim i as long
14.   Show
15.   Xstart =  ScaleWidth  2
16.   Ystart = ScaleHeight  2
17.   For i = 0 To Max
18.     Particle(I).LifeSpan = Rnd * 500
19.     Particle(i).X = Xstart
20.     Particle(i).Y = Ystart
21.     Particle(i).Yv = Rnd * -15
22.     Particle(i).Xv = Rnd * -10 + 5
23.   Next i
24.   bRunning =  True
25.   ParticleLoop
26. End Sub
27. Private Sub ParticleLoop
28.   Do While bRunning
29.     DoEvents
30.     For i = 0 To Max
31.       PSet (Particle(i).X, Particle(i).Y), BackColor
32.       Particle(i).X = Particle(i).X + Particle(i).Xv
33.       Particle(i).Y = Particle(i).Y + Particle(i).Yv
34.       Particle(i).Yv = Particle(i).Yv + 0.96
35.       If Particle(i).Y >= ScaleHeight Then
36.         Particle(i).Yv = -(Particle(i).Yv * 0.46)
37.         Particle(i).Y =  ScaleHeight
38.       End If
39.       Particle(i).LifeSpan = Particle(i).LifeSpan - 1
40.       If Particle(i).LifeSpan <= 0 Then
41.         Particle(i).LifeSpan = Rnd * 500
42.         Particle(i).X = Xstart
43.         Particle(i).Y = Ystart
44.         Particle(i).Yv = Rnd * -15
45.         Particle(i).Xv = Rnd * -10 + 5
46.       End If
47.       PSet (Particle(i).X, Particle(i).Y), RGB(0, 0, 0)
48.     Next i
49.     Refresh
50.   Loop
51. End Sub
52. Private Sub Form_Unload(Cancel As Integer)
53.   bRunning = False
54. End Sub

Tutorial by:

Dan

Date: 2004 Dec 2

Latest comment

by: autoaim

Basicly when the mouse moves just set the Xstart and Ystart variables to the mouse position like so:

[code]
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Xstart = X
Ystart = Y
End Sub
[/code]

The Xstart and Ystart is what holds the particles starting postion; So when ever a particle dies; it respawns to that position on the form.