Daily Creative Coding

元「30 min. Processing」。毎日、Creative Codingします。

マスクでスケッチを穴あきにする

/**
* Hole Mask
*
* @author aa_debdeb
* @date 2016/01/16
*/

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);
    
  }
}