 This page has bad source code style. If you can improve it according to Scratch Wiki:Style Guide, please do! (July 2020) This article is a stub. It may be incomplete, unfinished, or have missing parts/sections. If the article can be expanded, please do so! There may be suggestions on its talk page. (November 2019)

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

## Adding Particles to a List

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]) // We use the particle's items on the list to set the properties of the sprite
set pen size to (item ((i)+(5)) or [particles v]::list)
set pen color to (item ((i)+(4)) or [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 (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 ((i)+(1)) of [particles v] with ((item ((i)+(1)) of [particles v])+(item ((i) + (3)) of [particles v]))::list // Changing the y position of the particle by its y velocity
replace ((i)+(2)) of [particles v] with (((item ((i)+(2)) of [particles v])::list)-(1))::dark grey//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 we need to use them! Depending on the type of program you wish to make, you 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 you can make background effects

```When green flag clicked//If you make background effects, 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
```