// Deformable landscape demo with chunks of dirt thrown in // Uses my Particle class - but without the Physics engine so it looks a bit odd Bomb bomb; PGraphics collisionMap; ArrayList dirtList; ArrayList settleList; void setup(){ size(400, 400); collisionMap = createGraphics(width, height, JAVA2D); bomb = null; collisionMap.beginDraw(); collisionMap.background(255); for(int i = 0; i < collisionMap.width; i++){ collisionMap.line(i, collisionMap.height, i, 200); } collisionMap.noStroke(); collisionMap.smooth(); collisionMap.endDraw(); collisionMap.loadPixels(); dirtList = new ArrayList(); settleList = new ArrayList(); frameRate(25); noStroke(); fill(0); smooth(); } void draw(){ background(255); image(collisionMap, 0, 0); collisionMap.updatePixels(); for(int i = 0; i < dirtList.size(); i++){ Dirt temp = (Dirt)dirtList.get(i); ellipse(temp.x, temp.y, temp.size, temp.size); temp.fall(0, 1.0, 0.94); } settle(); if(bomb != null){ ellipse(bomb.x, bomb.y, 20, 20); bomb.fall(0, 1.0, 0.95); } if(mousePressed){ bomb = new Bomb(mouseX, mouseY, 20, 80); } } // Remove the landed chunks of dirt from the dirtList void settle(){ for(int i = 0; i < settleList.size(); i++){ Dirt temp = (Dirt)settleList.get(i); int index = dirtList.indexOf(temp); if(index > -1){ dirtList.remove(dirtList.indexOf(temp)); settleList.remove(i); } } } // Dirt hucking bomb object class Bomb extends Particle{ float size, blastRadius; Bomb(float x, float y, float size, float blastRadius){ super(x, y); this.size = size; this.blastRadius = blastRadius; } void fall(float gravityX, float gravityY, float damping){ verletSpecific(gravityX, gravityY, damping); int pixel = (int)x + (int)y * collisionMap.width; if(collisionMap.pixels[pixel] == #000000){ for(int i = 0; i < 20; i++){ dirtList.add(new Dirt(x, y)); } collisionMap.beginDraw(); collisionMap.fill(255); collisionMap.ellipse(x, y, blastRadius, blastRadius); collisionMap.endDraw(); bomb = null; } } } // A particle of dirt that flings itself into the air on creation class Dirt extends Particle{ float size; Dirt(float x, float y){ super(x, y); addVelocity(-10 + random(20), -5 - random(5)); size = 5 + random(15); } void fall(float gravityX, float gravityY, float damping){ verletSpecific(gravityX, gravityY, damping); int pixel = (int)x + (int)(y) * collisionMap.width; if(pixel < collisionMap.pixels.length){ if(collisionMap.pixels[pixel] == #000000){ collisionMap.beginDraw(); collisionMap.fill(0); collisionMap.ellipse(x, y, size, size); collisionMap.endDraw(); settleList.add(this); } } if(this.x > width + size || this.x < 0 - size || this.y > height+size){ settleList.add(this); } } }