class CannonBall extends Particle { color ballColor; float diameter; CannonBall() { ballColor = color(random(255), random(255), random(255)); diameter = 20 + random(70); minCollisionForce = diameter/2; maxCollisionForce = diameter; enableCollision(diameter/2 + 2); } void draw() { ellipseMode(CENTER_DIAMETER); push(); translate(pos[0], pos[1], pos[2]); noStroke(); fill(ballColor); ellipse(0,0,diameter,diameter); pop(); if (age > 200 && (pos[0] < -diameter || // test for offscreen pos[0] > width + diameter || pos[1] > height + diameter) ) die(); } } PSystem ps; void setup() { size(800, 500); ps = (PSystem)loadPlugin("PSystem"); ps.setGravity(0.5); framerate(45); } void fireLeft() { Particle p = new CannonBall(); p.pos[0] = 0; p.pos[1] = height; p.pos[2] = 0; ps.addParticle(p); p.velocity[0] = random(30); p.velocity[1] = random(-15) - 15; } void fireRight() { Particle p = new CannonBall(); p.pos[0] = width; p.pos[1] = height; p.pos[2] = 0; ps.addParticle(p); p.velocity[0] = random(-30); p.velocity[1] = random(-15) - 15; } int skipLoops = 10; void loop() { background(255); if (frame % skipLoops == 0) { fireLeft(); fireRight(); } ps.draw(); }