Ideation
For this assignment, I wanted to create something that was colorful and dynamic. My immediate thoughts went to something that would grow on the screen and somehow interact with other objects.
First iteration – without OOP
First, I just wanted to draw a circle on the screen at a fixed position and have it grow in size.
Once I finished this, I worked on creating an object for the circles so that I can have multiple of them on the screen using an array.
Second Iteration – OOP
I also wanted to add some randomness to the way the bubbles change, so I used random for creating a different starting position, radius, color, and growth rate. I removed the stroke because it looks neater.
Bubbles pop!
To make the bubbles pop, I did something similar to a coin flip but with tighter constraints so that they pop slower.
Pop them yourself
Click on the bubbles to pop them.
Find the code here and below:
let bubbles = [];
function setup() {
createCanvas(800, 800);
for (let i = 0; i < 100; i++) {
let colorVals = color(
random(255),
random(255),
random(255),
random(100, 150)
);
let growth = random(1.5);
let diameter = random(5);
let timer = random(20);
let x = random(diameter, height - diameter);
let y = random(diameter, width - diameter);
bubbles.push(new Bubble(x, y, diameter, timer, growth, colorVals));
}
}
function draw() {
background(220);
for (let i = 0; i < bubbles.length; i++) {
bubbles[i].run();
}
}
function mousePressed() {
for (let i = bubbles.length - 1; i >= 0; i--) {
let popped = bubbles[i].pop();
if (popped) {
bubbles.splice(i, 1);
break;
}
}
}
class Bubble {
constructor(posX, posY, diameter, timer, growth, colorValues) {
this.color = color(colorValues);
this.size = diameter;
this.timer = timer;
this.growth = growth;
this.x = posX;
this.y = posY;
this.radius = this.size / 2;
}
run() {
this.draw();
this.update();
}
draw() {
noStroke();
fill(this.color);
circle(this.x, this.y, this.size);
}
update() {
this.size += this.growth;
this.radius = this.size / 2;
}
pop() {
let d = dist(mouseX, mouseY, this.x, this.y);
if (d < this.radius) {
return true;
}
}
}