ArrayList particles = new ArrayList();
for (int i =0; i<20; i++) {
particles.add(new Particle(new PVector(random(width), random(height))));
for (int i =0; i<particles.size(); i++) {
Particle p = (Particle) particles.get(i);
PVector [] tailPositions = new PVector [tailLength];
Particle(PVector location_) {
velocity = new PVector((1-random(2)), 1-random(2));
acceleration = new PVector();
for (int i = 0; i < tailLength; i++) {
tailPositions[i] = new PVector(i,i);
PVector mouse = new PVector(mouseX, mouseY);
PVector dir = PVector.sub(mouse,location);
velocity.add(acceleration);
drawParticlesTails(0, location);
for (int i = 0; i < tailPositions.length-1; i++) {
drawParticlesTails(i+1, tailPositions[i]);
void drawParticlesTails(int i, PVector location_c) {
float direction = atan2(location_c.y - tailPositions[i].y, location_c.x - tailPositions[i].x);
tailPositions[i].x = location_c.x - cos(direction) * tailStep;
tailPositions[i].y = location_c.y - sin(direction) * tailStep;
translate(tailPositions[i].x, tailPositions[i].y);
fill(125 + sin(radians(frameCount))*125, 125 + cos(radians(frameCount))*125, 125 + sin(radians(-frameCount))*125);
float r = map(i,0,tailLength, 30, 1);
ellipse(location_c.x, location_c.y, r, r);
if ((location.x>width) || (location.x <0)) {
velocity.x = velocity.x * -1;
if ((location.y>height) || (location.y <0)) {
velocity.y = velocity.y * -1;