ArrayList<Particle> particles;
ArrayList<Hole> holes;
PGraphics mask;
void setup(){
size(500, 500);
smooth();
frameRate(30);
mask = createGraphics(width, height);
particles = new ArrayList<Particle>();
for(int i = 0; i < 700; i++){
particles.add(new Particle());
}
holes = new ArrayList<Hole>();
for(int i = 0; i < 150; i++){
holes.add(new Hole());
}
}
void draw(){
background(255);
noStroke();
fill(240, 230, 140);
for(Particle particle: particles){
particle.update();
ellipse(particle.pos.x, particle.pos.y, particle.diameter, particle.diameter);
}
mask.beginDraw();
mask.background(240, 230, 140);
mask.fill(255);
mask.noStroke();
for(Hole hole: holes){
hole.update();
mask.ellipse(hole.pos.x, hole.pos.y, hole.diameter, hole.diameter);
}
mask.endDraw();
blend(mask, 0, 0, width, height, 0, 0, width, height, DARKEST);
}
class Hole {
PVector pos;
float diameter;
float maxDiameter;
float speed;
Hole(){
pos = new PVector(random(width), random(height));
maxDiameter = map(random(1), 0, 1, 30, 70);
diameter = random(maxDiameter);
speed = map(random(1), 0, 1, 3, 10);
}
void update(){
if(diameter > maxDiameter || diameter < 0){
speed *= -1;
}
diameter += speed;
constrain(diameter, 0, maxDiameter);
}
}
class Particle {
PVector pos;
PVector vel;
float diameter;
Particle(){
pos = new PVector(random(width), random(height));
vel = new PVector(map(random(1), 0, 1, -1, 1), map(random(1), 0, 1, -1, 1));
vel.normalize();
vel.mult(5);
diameter = map(random(1), 0, 1, 5, 10);
}
void update(){
if(pos.x < 0 || pos.x > width){
vel.x *= -1;
}
if(pos.y < 0 || pos.y > height){
vel.y *= -1;
}
pos.add(vel);
}
}