/** Nut cracker - The day 21 door for my 2010 Advent calendar
by Guru */ PVector nutp; PVector nutv; void setup() { size(300,300,P2D); nutp = new PVector( 150, 0 ); nutv = new PVector( 0, 10 ); } int hammermode = 0; float r = 0; boolean left = false; void draw() { background(255); ellipseMode( CENTER ); fill( 250,190, 0 ); strokeWeight( 3 ); stroke( 200,128,0 ); ellipse( nutp.x, nutp.y, 20, 20 ); line( nutp.x - 10, nutp.y, nutp.x +10, nutp.y ); PVector test = nutp; test.add( nutv ); if (test.y > height-10) { nutv = new PVector( nutv.x + random( -nutv.y * 0.1, nutv.y * 0.1), -nutv.y*0.9 ); nutp.add( nutv ); } else { nutp = test; } if (nutp.x < 0 || nutp.x > width) nutv = new PVector( -nutv.x * 0.8, nutv.y*0.9 ); nutv.add( new PVector( 0, nutp.y < width ? 1 : 0 )); if (nutp.y > width - 9 && nutp.y > 0) nutv = new PVector(0,0); pushMatrix(); translate( mouseX, mouseY ); rotate( r ); noStroke(); fill( 200,128,0 ); rect( -5, -50, 10, 50); fill( 20 ); rect( -15, -60, 30, 10 ); popMatrix(); if (hammermode == 1) { r += left ? - 0.2 : 0.2; if ( r > PI/2 && !left || r < -PI/2 && left ) { r = left ? -PI/2 : PI/2; hammermode = 2; int sig = left ? -1 : 1; if (nutp.x > mouseX + (left? -70 : 40) && nutp.x < mouseX + (left?-40:70) && nutp.y > mouseY -25 && nutp.y < mouseY + 25 ) { nutp = new PVector( 150, 0 ); nutv = new PVector( 0, 10 ); } } } else if ( hammermode == 2 ) { r -= left ? -0.1 :0.1; if ( r < 0 && !left || r > 0 && left ) { r = 0; hammermode = 0; } } } void mousePressed() { hammermode = 1; left = nutp.x < mouseX; }