waterDrop[] rain; int maxSlope = 3; int numOfDrops = 1000; void setup(){ size(640,480); rain = new waterDrop[numOfDrops]; for(int i = 0; i < numOfDrops; i++){ // - - - - - - - - - - - - - - - Where to Start X - Drop Size - Drop Speed - - rain[i] = new waterDrop(random(10,width-10),random(3,15),random(3,8)); } frameRate(30); smooth(); } void draw(){ background(255); for(int i = 0; i < numOfDrops; i++){ rain[i].display(); rain[i].drop(mouseY, mouseX); } } class waterDrop { float dropWidth; float dropHeight; float xStart; float dropSpeed, speedMod; float dropSlope, beginX, beginY, endX, endY; waterDrop(float iX, float iXY, float iS){ beginX = iX; dropHeight = iXY; dropWidth = iXY/2.5; dropSpeed = iS; } void drop(int theY, int theX){ dropSlope = map(theX, 0, width, 0, maxSlope); speedMod = map(theY, 0, height, 1, 2.25); //Random to keep from a vertical stripe of rain if(theX < (beginX - random(1,25))){ endX = beginX; beginX = beginX - dropSlope; } if(theX > (beginX + random(1,25))){ endX = beginX; beginX = beginX + dropSlope; } beginY = beginY + (dropSpeed * speedMod); endY = beginY - dropHeight; if(beginY >= height){ beginY = 0; endY = 0; beginX = random(10,width-10); } } void display(){ //Catch the weird math errors if(abs(beginX-endX) > 10){ endX = beginX; } line(beginX, beginY, endX, endY); } }