Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*///////////////////////////////////////////////
 **        Gourmet Race By Ali Charif
 **           An Interactive Toy
 ** Nic Hesler, Introduction to Media Computation
 **               Tuesday 9am-12pm
/*///////////////////////////////////////////////

//CONTROLS: Hold left mouse button or press any key to eat.
void setup() { 
  size(400, 400); 
  frameRate(60);
}

//Kirby related variables
float kirbyXPos = 60;
float kirbyYPos = 205;
int kirbyFace = 1;
boolean kirbyEat = false;

//food
boolean shape1 = true;
float shape1X = 420;
boolean shape2 = true;
float  shape2X = 481;
boolean shape3 = true;
float  shape3X = 542;

//For drawing Conveyor gears with For loop
float gearXPos = 20;

//Score Variable
int score=0;
int lastScore;
int highScore=75; // 1st Ali:75 - 2nd Nathan:74 - 3rd Ema:65

//Conveyor initial Speed
float convSpd = -1;

//Conveyor Line Points
//float conv
float convLinePoint1 = 0;
float convLinePoint2 = 20;
float convLinePoint3 = 40;
float convLinePoint4 = 60;
float convLinePoint5 = 80;
float convLinePoint6 = 100;
float convLinePoint7 = 120;
float convLinePoint8 = 140;
float convLinePoint9 = 160;
float convLinePoint10 = 180;
float convLinePoint11 = 200;
float convLinePoint12 = 220;
float convLinePoint13 = 240;
float convLinePoint14 = 260;
float convLinePoint15 = 280;
float convLinePoint16 = 300;
float convLinePoint17 = 320;
float convLinePoint18 = 340;
float convLinePoint19 = 360;
float convLinePoint20 = 380;
float convLinePoint21 = 400;
float convLinePoint22 = 420;

//-----------------------------------------------------------
void mousePressed() {
  //Kirby EATS!
  kirbyEat = true; 
  kirbyFace = 2;
}
//-----------------------------------------------------------
void mouseReleased() {
  //Kirby Ignores...
  kirbyEat = false; 
  kirbyFace = 1;
}
//-----------------------------------------------------------
void keyPressed() {
  //Kirby EATS!
  kirbyEat = true; 
  kirbyFace = 2;
}
//-----------------------------------------------------------
void keyReleased() {
  //Kirby Ignores...
  kirbyEat = false; 
  kirbyFace = 1;
}
//-----------------------------------------------------------
//-----------------------------------------------------------
void draw() {

  stroke(0);
  strokeWeight(2);

  //Drawing Background, Conveyor, Scoreboard and Kirby
  drawBackground();
  drawConv();
  drawFacelessKirby();
  drawScores();
  drawInstr();

  //Kirby Face Change Conditions
  if (kirbyFace == 2) { 
    eatFace();
  } else if (kirbyFace == 3) { 
    deadFace();
  } else { 
    ignoreFace();
  }

  //Adding Speed to Conveyor lines
  convLinePoint1 = convLinePoint1 + convSpd - score*0.2;
  convLinePoint2 = convLinePoint2 + convSpd - score*0.2;
  convLinePoint3 = convLinePoint3 + convSpd - score*0.2;
  convLinePoint4 = convLinePoint4 + convSpd - score*0.2;
  convLinePoint5 = convLinePoint5 + convSpd - score*0.2;
  convLinePoint6 = convLinePoint6 + convSpd - score*0.2;
  convLinePoint7 = convLinePoint7 + convSpd - score*0.2;
  convLinePoint8 = convLinePoint8 + convSpd - score*0.2;
  convLinePoint9 = convLinePoint9 + convSpd - score*0.2;
  convLinePoint10 = convLinePoint10 + convSpd - score*0.2;
  convLinePoint11 = convLinePoint11 + convSpd - score*0.2;
  convLinePoint12 = convLinePoint12 + convSpd - score*0.2;  
  convLinePoint13 = convLinePoint13 + convSpd - score*0.2;
  convLinePoint14 = convLinePoint14 + convSpd - score*0.2;
  convLinePoint15 = convLinePoint15 + convSpd - score*0.2;
  convLinePoint16 = convLinePoint16 + convSpd - score*0.2;
  convLinePoint17 = convLinePoint17 + convSpd - score*0.2;
  convLinePoint18 = convLinePoint18 + convSpd - score*0.2;
  convLinePoint19 = convLinePoint19 + convSpd - score*0.2;
  convLinePoint20 = convLinePoint20 + convSpd - score*0.2;
  convLinePoint21 = convLinePoint21 + convSpd - score*0.2;
  convLinePoint22 = convLinePoint22 + convSpd - score*0.2;

  //Conveyor Line reset conditions
  if (convLinePoint2 <= 0) { 
    convLinePoint1 = 420; 
    convLinePoint2 = 440;
  }
  if (convLinePoint4 <= 0) { 
    convLinePoint3 = 420; 
    convLinePoint4 = 440;
  }
  if (convLinePoint6 <= 0) { 
    convLinePoint5 = 420; 
    convLinePoint6 = 440;
  }
  if (convLinePoint8 <= 0) { 
    convLinePoint7 = 420; 
    convLinePoint8 = 440;
  }
  if (convLinePoint10 <= 0) { 
    convLinePoint9 = 420; 
    convLinePoint10 = 440;
  }
  if (convLinePoint12 <= 0) { 
    convLinePoint11 = 420; 
    convLinePoint12 = 440;
  }
  if (convLinePoint14 <= 0) { 
    convLinePoint13 = 420; 
    convLinePoint14 = 440;
  }
  if (convLinePoint16 <= 0) { 
    convLinePoint15 = 420; 
    convLinePoint16 = 440;
  }
  if (convLinePoint18 <= 0) { 
    convLinePoint17 = 420; 
    convLinePoint18 = 440;
  }
  if (convLinePoint20 <= 0) { 
    convLinePoint19 = 420; 
    convLinePoint20 = 440;
  }
  if (convLinePoint22 <= 0) { 
    convLinePoint21 = 420; 
    convLinePoint22 = 440;
  }

  drawShape1();
  drawShape2();  
  drawShape3();

  shape1X = shape1X+convSpd - score*0.2; 
  shape2X = shape2X+convSpd - score*0.2; 
  shape3X = shape3X+convSpd - score*0.2; 

  //Off Screen Resets
  //Bad foods
  if (shape1X <= -30) { 
    shape1X = random(400, 600); 
    if (score > 0) { score--; }
  }
  //Good foods -1 score
  if (shape2X <= -30) { 
    shape2X = random(400, 600); 
    if (score > 0) { score--; }
  }
  
  if (shape3X <= -30) { shape3X = random(400, 600); }


  //Kirby Resets
  //Good foods +1 score
  if (shape1X >= kirbyXPos-20 && shape1X <=kirbyXPos+20 && shape1 && kirbyEat == true) { 
    shape1X = random(400, 600); 
    score++; 
    kirbyFace = 2;
  }
  if (shape2X >= kirbyXPos-20 && shape2X <=kirbyXPos+20 && shape2 && kirbyEat == true) { 
    shape2X = random(400, 600); 
    score++; 
    kirbyFace = 2;
  }
  //Bad foods resets score and Conveyor Speed
  if (shape3X >= kirbyXPos-20 && shape3X <=kirbyXPos+20 && shape3 && kirbyEat == true) { 
    shape3X = random(400, 600); 
    kirbyFace = 3; 
    if(score>highScore){ highScore = score; }
    else {lastScore = score;}
    if (lastScore == 0) { lastScore = score; }
    score = 0; 
    convSpd = -1;
  }

  //Conditions to keep shapes from overlapping
  if (shape1X >= shape2X-60 && shape1X <= shape2X+60 || shape1X >= shape3X-60 && shape1X <= shape3X+60  )
  { shape1X = random(400,600); }
  
  if (shape2X >= shape1X-60 && shape2X <= shape1X+60 || shape2X >= shape3X-60 && shape2X <= shape3X+60  )
  { shape2X = random(400,600); }
  
  if (shape3X >= shape2X-60 && shape3X <= shape2X+60 || shape3X >= shape1X-60 && shape3X <= shape1X+60  )
  { shape3X = random(400,600); }

}
//-----------------------------------------------------------
void drawBackground() {
  //sky
  background(1, 207, 254);

  //clouds
  noStroke();
  fill(255);
  ellipse(80, 40, 40, 40);
  ellipse(120, 40, 40, 40);
  ellipse(60, 60, 40, 40);
  ellipse(100, 60, 40, 40);
  ellipse(140, 60, 40, 40);
  ellipse(80, 80, 40, 40);
  ellipse(120, 80, 40, 40);
  ellipse(160, 80, 40, 40);

  ellipse(260, 40, 40, 40);
  ellipse(300, 40, 40, 40);
  ellipse(240, 60, 40, 40);
  ellipse(280, 60, 40, 40);
  ellipse(320, 60, 40, 40);
  ellipse(260, 80, 40, 40);
  ellipse(300, 80, 40, 40);
  ellipse(340, 80, 40, 40);

  //grass
  fill(0, 200, 0);
  rectMode(CORNER);
  rect(0, 290, 400, 110);
}
//-----------------------------------------------------------
void drawInstr() {
  textSize(15);
  text("GREEN: Yum!",20, 340);
  text("BLUE: Yum!",20, 355);
  text("RED: Yuck!",20, 370);
  textSize(12);
  text("Hold left mouse button or press any key to eat.",60, 310);
  
}
//-----------------------------------------------------------
void drawScores() {
  fill(0);
  textSize(30);
  text("SCORE: " + score, 180, 160);
  textSize(15);
  text("HIGH SCORE: " + highScore, 250, 340);
  text("LAST SCORE: " + lastScore, 250, 360);
}
//-----------------------------------------------------------
//drawing shapes
void drawShape1() {
  if (shape1 == true) {
    fill(0, 0, 255);
    ellipse(shape1X, 220, 40, 40);
  }
}

void drawShape2() {
  if (shape2 ==true) {
    fill(0, 255, 0);
    ellipse(shape2X, 220, 40, 40);
  }
} 
void drawShape3() {
  if (shape3 ==true) {
    fill(255, 0, 0);
    ellipse(shape3X, 220, 40, 40);
  }
}
//-----------------------------------------------------------
//Drawing Conveyor
void drawConv() {
  stroke(1);
  fill(98, 102, 105);
  rectMode(CORNER);
  rect(-1, 250, 401, 10);
  fill(159, 151, 149);
  rect(-1, 260, 401, 30);
  for (int i=18; i<=420; i=i+40) { drawGear(i, 275); }

  //Drawing Conveyor Belt
  line(convLinePoint1, 250, convLinePoint2, 260);
  line(convLinePoint3, 250, convLinePoint4, 260);
  line(convLinePoint5, 250, convLinePoint6, 260);
  line(convLinePoint7, 250, convLinePoint8, 260);
  line(convLinePoint9, 250, convLinePoint10, 260);
  line(convLinePoint11, 250, convLinePoint12, 260);
  line(convLinePoint13, 250, convLinePoint14, 260);
  line(convLinePoint15, 250, convLinePoint16, 260);
  line(convLinePoint17, 250, convLinePoint18, 260);
  line(convLinePoint19, 250, convLinePoint20, 260);
  line(convLinePoint21, 250, convLinePoint22, 260);
}
//-----------------------------------------------------------
//Drawing looped Gears
void drawGear(int x, int y) {
  //Gear
  fill(98, 102, 105);
  rectMode(CENTER);
  rect(x, y, 4, 20);
  rect(x, y, 20, 4);
  quad(x-8, y-6, x-6, y-8, x+8, y+6, x+6, y+8);
  quad(x-6, y+8, x-8, y+6, x+6, y-8, x+8, y-6);
  ellipse(x, y, 14, 14);
}
//-----------------------------------------------------------
void drawFacelessKirby() {
  
  //Kirby's body,arms,feet and cheeks
  stroke(0);

  //Right arm
  fill(255, 132, 170);
  ellipse(kirbyXPos+38, kirbyYPos+14, 15, 30);

  //Right foot
  fill(218, 0, 59);
  rectMode(CENTER);
  rect(kirbyXPos+14, kirbyYPos+40, 25, 14, 10);

  //Left foot
  fill(218, 0, 59);
  rectMode(CENTER);
  rect(kirbyXPos-10, kirbyYPos+40, 25, 14, 10);

  //body
  fill(255, 132, 170);
  ellipse(kirbyXPos, kirbyYPos, 80, 80);

  //Left arm
  fill(255, 132, 170);
  ellipse(kirbyXPos-38, kirbyYPos+14, 15, 30);

  //cheeks
  noStroke();
  fill(#ff6bbe);
  ellipse(kirbyXPos+26, kirbyYPos-2, 18, 8);
  ellipse(kirbyXPos-26, kirbyYPos -2, 18, 8);
}
//-----------------------------------------------------------
//KIRBY EATS
void eatFace() {
  stroke(0);
  fill(97, 25, 40);
  ellipse(kirbyXPos, kirbyYPos+14, 38, 40);
  noFill();
  strokeWeight(2);
  arc(kirbyXPos-15, kirbyYPos-5, 30, 30, PI + QUARTER_PI, PI + HALF_PI + QUARTER_PI);
  arc(kirbyXPos+18, kirbyYPos-5, 30, 30, PI + QUARTER_PI, PI + HALF_PI + QUARTER_PI);
  strokeWeight(1);
}
//-----------------------------------------------------------
//KIRBY IGNORES
void ignoreFace() {
  noFill();
  stroke(0);
  strokeWeight(2);
  arc(kirbyXPos, kirbyYPos-5, 50, 40, QUARTER_PI, HALF_PI + QUARTER_PI);
  arc(kirbyXPos-15, kirbyYPos-25, 30, 30, QUARTER_PI, HALF_PI + QUARTER_PI);
  arc(kirbyXPos+18, kirbyYPos-25, 30, 30, QUARTER_PI, HALF_PI + QUARTER_PI);
  strokeWeight(1);
}
//-----------------------------------------------------------
//KIRBY DIES
void deadFace() {
  stroke(0);
  line(kirbyXPos-20, kirbyYPos-27, kirbyXPos-5, kirbyYPos-12);
  line(kirbyXPos-5, kirbyYPos-27, kirbyXPos-20, kirbyYPos-12);
  line(kirbyXPos+8, kirbyYPos-27, kirbyXPos+23, kirbyYPos-12);
  line(kirbyXPos+23, kirbyYPos-27, kirbyXPos+8, kirbyYPos-12);
  fill(97, 25, 40);
  ellipse(kirbyXPos, kirbyYPos+14, 38, 40);
}