class Smoke extends Particle { Smoke(PVector pos) { super(pos, new PVector(random(1)-0.5, random(1)-0.5), 60); } void draw() { noStroke(); fill(255); ellipseMode(RADIUS); ellipse(pos.x, pos.y, 10 * life/maxlife, 10 * life/maxlife); } } class Lump extends GameObject { PVector vel; float gravity = 0.03; color col; Lump() { vel = new PVector(0,0); pos = new PVector(random(width), random(height)); radius = random(10)+10; col = color(random(128)+127, random(128)+127, random(128)+127); } void tick() { float speed = vel.mag(); PVector fvel; if(speed > speed_limit) { speed -= overspeed_drag; vel.normalize(); fvel = new PVector(vel.x, vel.y); vel.mult(speed); fvel.mult(speed_limit); particles.add(new Smoke(pos)); } else { fvel = new PVector(vel.x, vel.y); vel.y += gravity; if(vel.mag() > speed_limit) { vel.normalize(); vel.mult(speed_limit - 0.001); } } pos.add(fvel); if(pos.x < radius) { pos.x = radius * 2 - pos.x; vel.mult(rebound_drag); vel.x = -vel.x; } if(pos.x > width - radius) { pos.x = (width-radius) * 2 - pos.x; vel.mult(rebound_drag); vel.x = -vel.x; } if(pos.y < radius) { pos.y = radius * 2 - pos.y; vel.mult(rebound_drag); vel.y = -vel.y; } if(pos.y > height - radius) { pos.y = (height-radius) * 2 - pos.y; vel.mult(rebound_drag); vel.y = -vel.y; } } void draw() { noStroke(); fill(col); ellipseMode(RADIUS); ellipse(pos.x, pos.y, radius, radius); } }