> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.u2paszmTVHc/rev.8
 * 
 * authors: 
 *   GoToLoop

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



/** 
 * Raining Cloud (v2.51)
 * by  Jam131 (2014/Jan)
 * mod GoToLoop & Poersch
 *
 * forum.processing.org/two/discussion/2747/
 * how-to-spawn-an-object-at-mousex-but-make-it-not-move-with-cursor
 *
 * studio.processingtogether.com/sp/pad/export/ro.9l84$2z--gWui/latest
 */

static final int MIN_DIM = 3, MAX_DIM = 6;
static final int MIN_SPD = 4, MAX_SPD = 8;

static final short CLOUD_Y = 50;
static final short CLOUD_D = 0200, CLOUD_R = CLOUD_D>>1;
static final color CLOUD_C = 0340;

static final int NUM = 0100;
final Drop[] drops = new Drop[NUM];

void setup() {
  size(800, 300, JAVA2D);
  frameRate(60);
  smooth(4);

  noCursor();
  noStroke();

  colorMode(RGB, 0xFF);
  ellipseMode(CENTER);

  createDrops();
}

void createDrops() {
  for ( int i = 0; i != NUM; 
    drops[i++] = new Drop(random(-CLOUD_R, CLOUD_R), 
                          random(height - CLOUD_Y), 
                          random(MIN_DIM, MAX_DIM), 
                          random(MIN_SPD, MAX_SPD)) );
}

void draw() {
  //clear();  // Java
  background(0); // JS

  fill(Drop.COLOUR);
  for (Drop d: drops)  d.script();

  displayCloud();
}

void displayCloud() {
  fill(CLOUD_C);
  ellipse(mouseX, CLOUD_Y, CLOUD_D, 045);
  ellipse(mouseX, CLOUD_Y - 010, 055, 055);
  ellipse(mouseX + 040, CLOUD_Y - 015, 065, 065);
}

class Drop {
  static final color COLOUR = #50D0E0;

  short x, off;
  float y;

  final short dim;
  final float spd;

  Drop(float px, float py, float diam, float vel) {
    x = off = (short) px;
    y = py;
    dim = (short) diam;
    spd = vel;
  }

  void script() {
    display();
    update();
  }

  void display() {
    ellipse(x, y, dim, dim);
  }

  void update() {
    if ((y += spd) > height) {
      y = CLOUD_Y;
      x = (short) (mouseX + off);
    }
  }
}