/**
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;
}