//// Project 1b -- add some birds, use functions with input args. //// B.A.Martin, 2014 Sep 22 String title= "Igor chases Vlad (plus birds)"; String author= "Bruce Alan Martin: 2014 Sep 17"; float helpX, helpY; int score=0; float sunX=100, sunY=100; float horizon; float goldX, goldY; float vladX, vladY, vladW=50, vladH=80; float frankX, frankY, frankW=70, frankH=90; float frankStep; // Wobbly walk. int step; float look; float bird1X, bird1Y=20; float bird2X, bird2Y=40; float bird3X, bird3Y=60; float bird4X, bird4Y=80; void setup() { //// setup //// size( 800,600 ); horizon= height/4; sunY= horizon/2; score=0; reset(); } void reset() { // Start at corners. // goldX= random( width/4, width*3/4); goldY= random(horizon+20,height-20);; vladX= width-30; vladY= random( horizon,height-60 ); frankX=30; frankY= random( horizon,height-60 ); mouseY=height; } void draw() { // next frame // scene(); if (key == '?') { help(); return; } birds(); gold(); hero(); monster(); // Different step, every 15 frames. // step = step+1; if (step % 15 == 0) frankStep= random( -15, 15 ); } void help() { // Instructions // helpX= 100; helpY =horizon+20; say( "I N S T R U C T I O N S" ); say( "" ); say( "Hero chases gold -- +100 points." ); say( "Monster chases hero -- lose points if eaten!" ); say( "Click to move gold (but lose 50)." ); say( "(Also lose 10 points per day.)" ); say( "r key to reset (monster to left, hero to right, gold in the middle." ); say( "q key to quit" ); } void say( String s ) { //// Display one line of text (on next available line). //// text( s, helpX, helpY ); helpY += 12; // Next line. } void scene() { // sky, sun, etc. background( 200,200,255 ); fill(255,255,0); // yellow sun ellipse(sunX,sunY, 50,50); fill( 200,255,200); // grass rectMode( CORNER ); rect(0,horizon, width,height*3/4); // sun moves across sky. (-10 each day.) // if (sunX > width) { sunX=0; sunY= random( 10, horizon-20); score= score-10; } sunX= sunX+2; fill(0); // text( sunX, sunX, sunY+40); // Title, etc. // text( title, width/3, 20 ); //text( author, 20, height-20 ); //text( "SCORE= " + score, width-200, 50 ); } void birds() { /// Draw & move 3 birds bird1X += random(3,5); bird2X += random(2,4); bird3X += random(1,2); bird4X += random(2,3); if (bird1X>width-20) { bird1X= 80; bird1Y= random(20,horizon); } if (bird2X>width-20) { bird2X= 80; bird2Y= random(20,horizon); } if (bird3X>width-20) { bird3X= 80; bird3Y= random(20,horizon); } if (bird4X>width-20) { bird4X= 80; bird4Y= random(20,horizon); } // draw birds // fill( 255,0,0 ); drawBird( bird1X, bird1Y+5-random(5) ); fill( 255,155,0 ); drawBird( bird2X, bird2Y ); fill( 0,0,255 ); drawBird( bird3X, bird3Y ); fill( 0,255,255 ); drawBird( bird4X, bird4Y ); } void drawBird( float x, float y ) { //// draw one bird ///// triangle( x,y, x-60,y-10, x-60,y+10 ); // body /* if ( (step/30) % 4 == 0 ) { birdWing( x, y, 20 ); } else if ( (step/30) % 4 == 1 ) { birdWing( x, y, 10 ); } else if ( (step/30) % 4 == 2 ) { birdWing( x, y, -20 ); } else { birdWing( x, y, -10 ); } */ float flap; if ( step/30 % 4 == 0 ) flap= 20; else if ( step/30 % 4 == 1 ) flap= -10; else if ( step/30 % 4 == 2 ) flap= -20; else flap= +10; birdWing( x, y, flap ); } void birdWing( float x, float y, float yup ) { // Draw the wing. triangle( x-20,y, x-40,y, x-40,y-yup ); } void hero() { //// move & draw Vlad //// vladX= vladX + (goldX-vladX)/30; vladY= mouseY + (goldY-vladY)/30; if (vladYvladX ? +1 : -1; fill(255,127,0); head( vladX,vladY-vladH/2-10, 40 ); //-- ellipse(vladX,vladY-vladH/2-10, 40,50); // legs & arms strokeWeight(6); leg( vladX-25, vladY+vladH/2, 40, -frankStep/2 ); leg( vladX+25, vladY+vladH/2, 40, frankStep/2 ); strokeWeight(0); arm( -40, vladX-vladW/2, vladY-vladH/2 ); arm( +40, vladX+vladW/2, vladY-vladH/2 ); //// Now, get the gold! // if ( dist( vladX,vladY, goldX,goldY ) < 50 ) { score += random( 100,200 ); background(255,255,255); reset(); } } void monster() { // move & draw Vlad // // chase vlad frankX= frankX + (vladX-frankX)/150; frankY= frankY + (vladY-frankY)/150; // Monster catches hero. // if ( dist( vladX,vladY, frankX,frankY ) < 50 ) { eat(); } // Monster gets the gold. // if ( dist( goldX,goldY, frankX,frankY ) < 50 ) { goldX= 50; goldY= random(horizon,height); } // draw frank // drawFrank( frankX, frankY ); } void drawFrank( float frankX, float frankY ) { // draw Frank // fill( 150,0,0 ); rectMode( CENTER ); rect( frankX, frankY, frankW, frankH ); fill(0); text( "Frank", frankX-20, frankY-10 ); // head & eyes, arms, legs // look= frankXhorizon) { fill(random(200,250),random(100,200),random(150)); ellipse( goldX,goldY, 40+random(20),40+random(20) ); fill(random(150,250),random(150,200),random(100)); ellipse( goldX,goldY, 30+random(15),30+random(15) ); fill(255,255,0); ellipse( goldX,goldY, 20+random(20),20+random(20) ); } } void scoring() { } void eat() { //// Monster eats hero!!!! Deduct 200 from score. score= score - 200; background(255,0,0); reset(); } void mousePressed() { //// Click. //// goldX= mouseX; goldY= mouseY; score= score - 50; frankX=0; frankY= random(20,height-20); } void keyPressed() { //// Handle keys. //// if (key == 'q') exit(); if (key == 'r') reset(); }