Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/////////////////////////////////////*BEE BOUNCE!- Assignment 2: Interactive Toy*/////////////////////////////////////
////*Purpose and Functionality: Jump accross the flower field by jumping on flowers, try not to miss and fall! *////
///////////////////////////////////*Controls: Use RIGHT Key to Bounce on Flowers*///////////////////////////////////
//////////////////////////////////////////////////*By: Sima Naseem*/////////////////////////////////////////////////

//BEE variables
float beeX = 60;
float beeY = 10;
float beeW = 50;
float beeH = 40;
float speedY = 1;
float sadBX=180;
float sadBY=300;
float leeway=6;

//FLOWER variables
float x, y;
float flowerX1=30;
float flowerY1=200;
float flowerX2=230;
float flowerY2=200;
float flowerX3=230;
float flowerY3=200;

//GRASS variables
float grassX=-10;
float grassY=400;

//SCORE variables
int score = 0;
int highscore = 0;

//POLLEN variables (credits:Marty Daniels)
float px, py;
float ellipseMin = 1;
float ellipseMax = 14;
float ellipseSize = ellipseMin;
float dotBrightness = 255;
float dotBrightnessMax = 200;

void setup() {
  size(400, 400);
  smooth();
  noStroke();
  ellipseMode(CORNER);
  rectMode(CORNER);
}

void draw() {
  drawBackground();
  flowers();
  drawBee();
  updateBee();
  updateFlower();
  drawPollen();
}

/////*FUNCTIONS*/////

//DRAW BACKGROUND

void drawBackground() {
  background(140, 195, 201);
  //draw rectangles in the sky --loop
  for (int i=0; i<400; i+=200) {
    fill(255, 255, 255, 40);
    rect(0, i, 400, 100);
  }

  //controls drawn on screen so people know how to play
  fill(255);
  textSize (20);
  text("Press -> to Bounce!", 190, 30);

  //draw grass triangles --loop
  for (int i=0; i<400; i+=30) {
    fill(100, 150, 40);
    triangle(grassX+i, grassY, grassX+i+15, grassY-40, grassX+i+30, grassY);
  }
}

/*FLOWER OBSTACLES*/


//CALL FLOWERS ->function used to call the drawFlowers function
//this makes it easier to input 3 variables instead of making 3 different functions with different dimensions for each flower
void flowers() {
  drawFlowers(flowerX1, flowerY1);
  drawFlowers(flowerX2, flowerY2);
  drawFlowers(flowerX3, flowerY3);
}
//DRAW FLOWERS
//inputs x and y variables and draws a flower in that location
void drawFlowers(float flowerX, float flowerY) {
  //x and y contain the x and y coordinates of the new flower
  x=flowerX;
  y=flowerY;

  //DRAW FLOWER
  //stem
  fill(100, 100, 40);
  rect(x+45, y+10, 10, 200);
  //leaves
  quad(x+15, y+80, x+35, y+90, x+25, y+110, x+15, y+100);
  quad(x+25, y+110, x+35, y+115, x+50, y+110, x+35, y+90);
  quad(x+50, y+90, x+70, y+90, x+85, y+80, x+60, y+70);
  quad(x+60, y+70, x+85, y+80, x+100, y+50, x+70, y+60);
  //middle
  fill(240, 220, 0);
  ellipse(x+20, y-10, 60, 40);
  //petals
  fill(250, 86, 127);
  ellipse(x-5, y-10, 30, 20);
  ellipse(x, y+3, 20, 20);
  ellipse(x+15, y+4, 20, 30);
  ellipse(x+30, y+9, 25, 30);
  ellipse(x+50, y+9, 25, 30);
  ellipse(x+70, y+4, 20, 30);
  ellipse(x+75, y-10, 30, 20);
  ellipse(x+80, y+3, 20, 20);


  //COLLISIONS FOR ALL FLOWERS AND BEE

  //If the beeX is in between the x boundaries of the flower it will bounce back up
  if ((x-35<=beeX&&beeX+beeW<=x+100+35)) {

    //if beeY is lower than flower y
    if (beeY > y - beeH) {
      // set the position to be directly above flower y
      beeY = y- beeH;
      // bee moves in the opposite direction 
      speedY = -1*speedY;

      //score increments every time the bee hits the flower (bounces)
      score++;

      //print everytime the bee bounces
      if (score==1)println("Bee bounced "+score+" time!");
      else println("Bee bounced "+score+" times!");

      //pollen dust credz:Marty Daniels (this was done for decorative/aesthetic purposes)
      ellipseSize = ellipseMax; // make the circles pulse
      dotBrightness = dotBrightnessMax; // make the circles bright
    }
    //if beeY is less than 10 reverse speed direction
    else if (beeY <= 10) { 
      //switch the direction and make it bounce off
      speedY = -1*speedY;
    }
  }

  //GAME OVER SCREEN
  else if (beeY>=height) {
    background(99, 149, 85);
    
    //draw text for end screen
    textSize(60);
    fill(255);
    text("GAME OVER", 20, 60);
    textSize(35);
    text("Refresh to Play Again!!", 07, 250);
    textSize(30);
    //show amount of bounces player got
    text("Bee Bounced "+score+" Times", 40, 160);
    
    //graphics
    //grass
    fill(23, 85, 40);
    rect(0, 335, 400, 200);
    for (int i=0; i<400; i+=30) {
      triangle(grassX+i, grassY-65, grassX+i+15, grassY-90, grassX+i+30, grassY-65);
    }
    //sad bee on ground
    drawSadBee();
    
  }
}

/*UPDATE FLOWER*/

//when RIGHT key is pressed, flowers will scroll to the left and bee will be able to bounce on them 
void updateFlower() {
  if (keyPressed) {
    if (keyCode==RIGHT) {
      flowerX1-=10;
    }
  }
  if (keyPressed) {
    if (keyCode==RIGHT) {
      flowerX2-=10;
    }
  }
  if (keyPressed) {
    if (keyCode==RIGHT) {
      flowerX3-=10;
    }
  }

  //when flower's x value is less than -100 bring it back to 400 + a random distance between 0 and 100
  //flowers may be randomly placed in front of another but its okay because that happens in nature so its realistic :D
  if (flowerX1<=-100) {
    int r=(int)(random(0, 100));
    flowerX1=400+r;
  }
  if (flowerX2<=-100) {
    int r=(int)(random(0, 100));
    flowerX2=400+r;
  }
  if (flowerX3<=-100) {
    int r=(int)(random(0, 100));
    flowerX3=400+r;
  }
}
//DRAW BEE
void drawBee() {
  //bee
  noStroke();
  //stinger
  fill(125, 154, 216);
  triangle(beeX+2, beeY+2, beeX+8, beeY+10, beeX+3, beeY+15);
  //back wing
  ellipse(beeX+22, beeY+3, 10, 20);
  //body
  fill(0);
  arc(beeX, beeY, beeW, beeH, 0, PI);
  ellipse(beeX, beeY+10, 20, 20);
  ellipse(beeX+30, beeY+10, 20, 20);
  //eye and smile
  fill(255);
  ellipse(beeX+35, beeY+17, 3, 3);
  noFill();
  strokeWeight(1);
  stroke(255);
  arc(beeX+42, beeY+13, 15, 10, (PI)/2, PI);
  //legs
  stroke(0);
  arc(beeX+35, beeY+30, 20, 20, (3*PI)/2, (15*PI)/8);
  arc(beeX+32, beeY+33, 20, 20, (3*PI)/2, (15*PI)/8);
  arc(beeX-6, beeY+28, 20, 20, PI, (3*PI)/2);
  arc(beeX-2, beeY+31, 20, 20, PI, (3*PI)/2);
  //antenna
  arc(beeX+40, beeY+3, 20, 20, PI, (3*PI)/2);
  ellipse(beeX+47, beeY+2, 3, 3);
  noStroke();
  //stripes
  stroke(252, 231, 69);
  strokeWeight(3);
  line(beeX+30, beeY+20, beeX+40, beeY+34);
  line(beeX+25, beeY+20, beeX+30, beeY+38);
  line(beeX+22, beeY+20, beeX+17, beeY+38);
  line(beeX+20, beeY+20, beeX+7, beeY+32);
  line(beeX+17, beeY+17, beeX+1, beeY+25);
  noStroke();
  //front wing
  fill(193, 213, 255);
  ellipse(beeX+17, beeY+3, 10, 20);
}

//UPDATE BEE
void updateBee() {
  //add gravity to speed
  speedY = speedY + 0.5;  
  //add speed to the bee's Y coordinates
  //bee goes up or down
  beeY = beeY + speedY;
}

/*POLLEN DUST*/ 
//credits to pulsing elllipse from Marty Daniel's code

//added this effect to make the bounce seem more realistic
//functions created to duplicate pollen dust in different locations
void drawPollen() {
  //pollen variables
  float pX1 = 30;
  float pY1 = 182;
  float pX2 = 40;
  float pY2 = 170;
  float pX3 = 60;
  float pY3 = 190;
  float pX4 = 100;
  float pY4 = 192;
  float pX5 = 120;
  float pY5 = 175;
  float pX6 = 145;
  float pY6 = 185;
  //calls pollen function
  pollen(pX1, pY1);
  pollen(pX2, pY2);
  pollen(pX3, pY3);
  pollen(pX4, pY4);
  pollen(pX5, pY5);
  pollen(pX6, pY6);
}
//everytime the bee hits the flower, dust appears
void pollen(float pollenX, float pollenY) {
  px=pollenX;
  py=pollenY;
  //draw pollen
  fill(240, 220, 55, dotBrightness);
  ellipse(px, py+ sin(px + millis()/60)*2, ellipseSize, ellipseSize);
  //if ellipse is bigger than minimum it shrinks and disappears
  if (ellipseSize > ellipseMin) {
    ellipseSize -= (ellipseSize-ellipseMin)/10;
  }
  dotBrightness -= 3;
}

//DRAW SAD BEE
//FOR GAME OVER SCREEN
//just changes bee's smile to a frown (extra stuff added towards the end to make it more fun)
void drawSadBee() {
  //bee
  noStroke();
  //stinger
  fill(125, 154, 216);
  triangle(sadBX+2, sadBY+2, sadBX+8, sadBY+10, sadBX+3, sadBY+15);
  //back wing
  ellipse(sadBX+22, sadBY+3, 10, 20);
  //body
  fill(0);
  arc(sadBX, sadBY, beeW, beeH, 0, PI);
  ellipse(sadBX, sadBY+10, 20, 20);
  ellipse(sadBX+30, sadBY+10, 20, 20);
  //eye and sad face
  fill(255);
  ellipse(sadBX+35, sadBY+17, 3, 3);
  noFill();
  strokeWeight(1);
  stroke(255);
  arc(sadBX+42, sadBY+13, 10, 15, PI, (3*PI)/2);
  //legs
  stroke(0);
  arc(sadBX+35, sadBY+30, 20, 20, (3*PI)/2, (15*PI)/8);
  arc(sadBX+32, sadBY+33, 20, 20, (3*PI)/2, (15*PI)/8);
  arc(sadBX-6, sadBY+28, 20, 20, PI, (3*PI)/2);
  arc(sadBX-2, sadBY+31, 20, 20, PI, (3*PI)/2);
  //antenna
  arc(sadBX+40, sadBY+3, 20, 20, PI, (3*PI)/2);
  ellipse(sadBX+47, sadBY+2, 3, 3);
  noStroke();
  //stripes
  stroke(252, 231, 69);
  strokeWeight(3);
  line(sadBX+30, sadBY+20, sadBX+40, sadBY+34);
  line(sadBX+25, sadBY+20, sadBX+30, sadBY+38);
  line(sadBX+22, sadBY+20, sadBX+17, sadBY+38);
  line(sadBX+20, sadBY+20, sadBX+7, sadBY+32);
  line(sadBX+17, sadBY+17, sadBX+1, sadBY+25);
  noStroke();
  //front wing
  fill(193, 213, 255);
  ellipse(sadBX+17, sadBY+3, 10, 20);
}