/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://p5js.sketchpad.cc/sp/pad/view/ro.IK-4Sq4sciK/rev.3
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
/**
* Clickable Balls (v1.0)
* Jcov (2017-May-21)
* Mod GoToLoop
*
* forum.Processing.org/two/discussion/22678/
* problem-regarding-arraylist#Item_10
*
* p5js.SketchPad.cc/sp/pad/view/ro.CaQVvhrEKxAeXd/latest
*/
"use strict";
const BALLS = 10, balls = [];
let bg;
function setup() {
createCanvas(500, 500);
noLoop();
ellipseMode(CENTER).colorMode(RGB);
fill('blue').stroke('cyan').strokeWeight(1.5);
bg = color('#F0A');
}
function draw() {
background(bg);
balls.length || makeBalls();
for (const b of balls) b.display();
}
function mousePressed() {
for (let i = balls.length; i--; )
if (balls[i].isMouseWithinCircle()) {
const tail = balls.pop();
if (i !== balls.length) balls[i] = tail;
redraw();
break;
}
return false;
}
function makeBalls() {
balls.length = 0;
for (let i = 0; i++ < BALLS; balls.push(new Ball));
}
class Ball {
constructor() {
this.x = round(random(Ball.RAD, width - Ball.RAD));
this.y = round(random(Ball.RAD, height - Ball.RAD));
}
display() {
ellipse(this.x, this.y, Ball.DIAM);
}
isMouseWithinCircle() {
return sq(mouseX - this.x) + sq(mouseY - this.y) < Ball.RAD_SQ;
}
}
Ball.DIAM = 20;
Ball.RAD = Ball.DIAM >> 1;
Ball.RAD_SQ = Ball.RAD * Ball.RAD;