This tutorial will show how to make pen particles. These are often used as background or death effects in many games.

The first step to making pen particles is making a list of particles as a 2D array, each particle will have more than one item on the particles list. First, a list needs to be created, called particles:

`(particles::list)`

Now, a script that adds a particle at a certain x and y position with a certain x and y velocity.

```define Add particle | Position:(x), (y) | Velocities: (X Vel) (Y Vel) Color: (color) Size (size::custom)
add (x::custom) to [particles v] // The starting X position of the particle
add (y::custom) to [particles v] // The starting Y position of the particle
add (X vel::custom) to [particles v] // The starting X velocity of the particle
add (Y vel::custom) to [particles v] // The starting Y velocity of the particle
add (color::custom) to [particles v] // The color of the particle
add (size::custom) to [particles v] // The size of the particle
```

Deleting Particles

Now a script needs to be created to delete a particle at a certain item on the particles list:

```define Delete particle (i)
delete ((i)+(5)) of [particles v] // starts at the particle's last item in the list
delete ((i)+(4)) of [particles v] // and moves back until all items on the list that belong to that particle are deleted
delete ((i)+(3)) of [particles v]
delete ((i)+(2)) of [particles v]
delete ((i)+(1)) of [particles v]
delete (i) of [particles v]
```

Rendering Particles

A script will also be needed to render the particles that are already stored in the particles list:

```define Render
erase all // erasing all of the drawing made previously
set [i v] to (1)
repeat ((length of [particles v]::list)/(6)) // The amount of particles in the list because each particle takes up 6 items
go to x: (item (i) of [particles v]) y: (item ((i)+(1)) of [particles v]) // This tutorial uses the particle's items on the list to set the properties of the sprite
set pen size to (item ((i)+(5)) of [particles v]::list)
set pen color to (item ((i)+(4)) of [particles v]::list)
pen down // Making a dot
pen up
change [i v] by (6)
```

Updating the Particles' Positions

This script moves the particles around:

```define Update
set [i v] to (1)
repeat ((length of [paticles v])/(6)
replace item (i) of [particles v] with ((item (i) of [particles v])+(item ((i) + (2)) of [particles v]))::list // Changing the x position by the x velocity
replace item ((i)+(1)) of [particles v] with ((item ((i)+(1)) of [particles v])+(item ((i) + (3)) of [particles v])) // Changing the y position of the particle by its y velocity
replace item ((i)+(2)) of [particles v] with (((item ((i)+(2)) of [particles v])::list)-(1))//Optional gravity, change the Y velocity by -1
if<<([abs v](item (i) of [particles v])::operators)>(240)> or<([abs v](item ((i)+(1)) of [particles v])::operators)>(180)>>then
Delete particle (i)::custom // if the particle if off the screen, delete it.
end
change [i v] by (6)
```

Implementing The Code

Now that all the scripts are made, they must be used. Depending on the type of program wished to make, one may want to make mouse effects:

```When green flag clicked
delete all of [particles v]
forever
Add particle | Position:(mouse x), (mouse y) | Velocities: (pick a random (-10) to (10)::operators) (pick a random (-10) to (10)::operators) Color: (pick a random (0) to (100)::operators) Size (pick a random (-10) to (10)::operators)::custom
Update::custom
Render::custom
end
```

Or one can make background effects:

```When green flag clicked//If  background effects are made, make sure that they do not have gravity by removing the change y velocity block in the update script.
delete all of [particles v]
forever
Add particle | Position:(pick a random (-240) to (240)::operators), (pick a random (-180) to (180)::operators) | Velocities: (pick a random (-10) to (10)::operators) (pick a random (-10) to (10)::operators) Color: (pick a random (0) to (100)::operators) Size (pick a random (-10) to (10)::operators)::custom
Update::custom
Render::custom
end
```
Cookies help us deliver our services. By using our services, you agree to our use of cookies.