Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
//Claire Jarzab
//#991524076

//Alice has decided to jump between the different mushrooms. 
//Move Alice left and right with 'A' and 'D'. Each mushroom launches her different heights.
//Avoid touching the ground!

//Psuedocode at the bottom of the code.

///////////////////////////////////////////////////////////////////////////////////////////
//Global Variables
///////////////////////////////////////////////////////////////////////////////////////////

//variables used to draw mushrooms
int mushroom1X = 40;
int mushroom1Y = 390;

int mushroom2X = 200;
int mushroom2Y = 390;

int mushroom3X = 360;
int mushroom3Y = 390;

//variables used to draw and move Alice
int aliceFeetX = 200;
int aliceFeetY = 200;
int aliceMoveSpeed = 3;

boolean aliceRight = false;
boolean aliceLeft = false;

boolean aliceFall = true;
int fallSpeed = 4;
int upSpeed = 1;

/////////////////////////////////////////////////////////////////////////////////////////
//Setup
/////////////////////////////////////////////////////////////////////////////////////////

void setup() {

  //Set Frame Rate
  frameRate(60);

  //Setup screen size
  size(400, 400);
}

/////////////////////////////////////////////////////////////////////////////////////
//Draw
///////////////////////////////////////////////////////////////////////////////////////

void draw() {

  //Moves alice
  moveAlice();
  //Determines whether Alice is rising or falling
  setAliceBouncing();

  //Determines when Alice should come back down
  aliceReturn();

  //Background colour set to Dark Green
  background(52, 52, 2);
  //background(10, 51, 7);

  //Draws background assets
  drawPineTreeDark();
  drawLeafTree();
  drawPineTree();

  //Draws Mushrooms and Alice
  drawMushrooms();
  drawAlice();
}

///////////////////////////////////////////////////////////////////////////////
//MOVEMENT AND CHANGES
////////////////////////////////////////////////////////////////////////////////

//Moves Alice's position
void moveAlice() {

  //Determines whether Alice should be falling and makes her fall, if not then she is rising
  if (aliceFall == true) {
    aliceFeetY= aliceFeetY + fallSpeed;
  } else {
    aliceFeetY= aliceFeetY - upSpeed;
  }

  //Determines if Alice hits the ground, if she does then game over prints, prevents her from going trhough the ground
  if (aliceBoundariesY()) {
    println ("Game Over! Please Refresh!");
    aliceFeetY=height;
  }

  //Sets boundaries, prevents Alice from leaving the left and right sides of the screens, she is still able to bounce upwards out of view
  //Determines what the key press does, Moves Alice Left and Right at set speed
  if (aliceBoundariesX()) {

    if (aliceLeft == true) {
      aliceFeetX+=-aliceMoveSpeed;
    }

    if (aliceRight == true) {
      aliceFeetX+=aliceMoveSpeed;
    }
  } else if (!aliceBoundariesX() && aliceFeetX<0) {
    aliceFeetX=0;
  } else if (!aliceBoundariesX() && aliceFeetX>width) {
    aliceFeetX=width;
  }
}

//Checks to see where Alice is on the X axis
boolean aliceBoundariesX() {
  if (aliceFeetX>=0) {
    if (aliceFeetX<=width) {
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

//Checks to see where Alice is on the Y axis
boolean aliceBoundariesY() {
  if (aliceFeetY>=height) {
    return true;
  } else
    return false;
}

//Assigns A and D on the keyboard to Left and Right
void keyPressed() {

  if (key == 'a') {
    aliceLeft=true;
  }

  if (key == 'd') {
    aliceRight=true;
  }
}

//Once the key is released, Alice doesn't move
void keyReleased() {

  if (key == 'a') {
    aliceLeft=false;
  }

  if (key == 'd') {
    aliceRight=false;
  }
}

//Determines whether Alice has stepped on a mushroom and if so, stops her decent and causes her to go up at a random speed
void setAliceBouncing() {

  if (aliceFeetY >= 330 && aliceFeetY<=340) { 
    if (aliceFeetX >=0 && aliceFeetX <=80) {
      upSpeed = int(random(3, 20));
      aliceFall=false;
    } else if (aliceFeetX >=160 && aliceFeetX <=240) {
      upSpeed = int(random(3, 40));
      aliceFall=false;
    } else if (aliceFeetX >=320 && aliceFeetX <=400) {
      upSpeed = int(random(3, 5));
      aliceFall=false;
    } else {
      return;
    }
  }
}

//Stops Alice's accension and brings her back to falling, the point at which she is stopped is determined by the random number assigned to upSpeed
void aliceReturn() {
  if (aliceFeetY < 200 - (upSpeed *10) ) {
    aliceFall = true;
  }
}


////////////////////////////////////////////////////////////////////////////////////
//ASSETS
////////////////////////////////////////////////////////////////////////////////////

//Draws different tree lines

void drawPineTreeDark () {
  float treeLinePineDarkX=10;
  while (treeLinePineDarkX<width) {

    fill(41, 30, 2);
    rectMode(CORNERS);
    noStroke();

    rect(treeLinePineDarkX, 10, treeLinePineDarkX+25, 270);
    ellipse(treeLinePineDarkX+12.5, 270, 25, 10);
    // triangle(treeLinePineDarkX, 0, treeLinePineDarkX-18, 7, treeLinePineDarkX-6.5, 6.5);
    treeLinePineDarkX+=80;
  }
}

void drawLeafTree() {
  float treeLineLeafX=20;
  while (treeLineLeafX<width) {

    noStroke();
    fill(108, 61, 5);                    
    rectMode(CORNERS);
    rect(treeLineLeafX, 0, treeLineLeafX+10, 290);
    ellipse(treeLineLeafX+5, 290, 10, 5);

    fill(38, 33, 1);
    ellipseMode(CENTER);
    ellipse(treeLineLeafX+5, 0, 130, 100);

    treeLineLeafX+=40;
  }
}

void drawPineTree() {
  float treeLinePineDarkX=35;
  float treeLinePineDarkPines=5;
  float treeLinePineDarkPinesTwo=5; 
  while (treeLinePineDarkX<width) {

    fill(70, 102, 27);
    rectMode(CORNERS);
    noStroke();

//Draws Pine needles on front trees
    while (treeLinePineDarkPines<220) {
      triangle(treeLinePineDarkX+10, treeLinePineDarkPines-15, treeLinePineDarkX+90, treeLinePineDarkPines+70, treeLinePineDarkX+40, treeLinePineDarkPines+40);
      treeLinePineDarkPines+=20;
    }

    while (treeLinePineDarkPinesTwo<220) {
      triangle(treeLinePineDarkX+20, treeLinePineDarkPinesTwo-15, treeLinePineDarkX-80, treeLinePineDarkPinesTwo+70, treeLinePineDarkX-30, treeLinePineDarkPinesTwo+40);
      treeLinePineDarkPinesTwo+=20;
    }

    rect(treeLinePineDarkX, 0, treeLinePineDarkX+20, 310);
    ellipse(treeLinePineDarkX+10, 310, 20, 10);
    treeLinePineDarkX+=100;
    treeLinePineDarkPines=5;
    treeLinePineDarkPinesTwo=5;
  }
}


//Draws the three mushrooms
void drawMushrooms() {
  ellipseMode(CENTER);
  rectMode(CORNERS);
  noStroke();

  //mushroom1
  fill(120, 255, 198);
  ellipse(mushroom1X, mushroom1Y, 20, 20);
  quad(mushroom1X-10, mushroom1Y, mushroom1X+10, mushroom1Y, mushroom1X+5, mushroom1Y-20, mushroom1X-5, mushroom1Y-20);

  fill(151, 0, 204);
  ellipse(mushroom1X-30, mushroom1Y-30, 20, 20);
  ellipse(mushroom1X+30, mushroom1Y-30, 20, 20);
  rect(mushroom1X-30, mushroom1Y-30, mushroom1X+30, mushroom1Y-20);
  arc(mushroom1X, mushroom1Y-30, 80, 70, PI, TWO_PI);

  fill(120, 255, 198);
  ellipse(mushroom1X-15, mushroom1Y-45, 15, 15);
  ellipse(mushroom1X+10, mushroom1Y-30, 5, 5);
  ellipse(mushroom1X+20, mushroom1Y-40, 20, 20);

  //mushroom2
  fill(120, 255, 198);
  ellipse(mushroom2X, mushroom2Y, 20, 20);
  quad(mushroom2X-10, mushroom2Y, mushroom2X+10, mushroom2Y, mushroom2X+5, mushroom2Y-20, mushroom2X-5, mushroom2Y-20);

  fill(151, 0, 204);
  ellipse(mushroom2X-30, mushroom2Y-30, 20, 20);
  ellipse(mushroom2X+30, mushroom2Y-30, 20, 20);
  rect(mushroom2X-30, mushroom2Y-30, mushroom2X+30, mushroom2Y-20);
  arc(mushroom2X, mushroom2Y-30, 80, 70, PI, TWO_PI);

  fill(120, 255, 198);
  ellipse(mushroom2X-15, mushroom2Y-45, 15, 15);
  ellipse(mushroom2X+10, mushroom2Y-30, 5, 5);
  ellipse(mushroom2X+20, mushroom2Y-40, 20, 20);

  //mushroom3
  fill(120, 255, 198);
  ellipse(mushroom3X, mushroom3Y, 20, 20);
  quad(mushroom3X-10, mushroom3Y, mushroom3X+10, mushroom3Y, mushroom3X+5, mushroom3Y-20, mushroom3X-5, mushroom3Y-20);

  fill(151, 0, 204);
  ellipse(mushroom3X-30, mushroom3Y-30, 20, 20);
  ellipse(mushroom3X+30, mushroom3Y-30, 20, 20);
  rect(mushroom3X-30, mushroom3Y-30, mushroom3X+30, mushroom3Y-20);
  arc(mushroom3X, mushroom3Y-30, 80, 70, PI, TWO_PI);

  fill(120, 255, 198);
  ellipse(mushroom3X-15, mushroom3Y-45, 15, 15);
  ellipse(mushroom3X+10, mushroom3Y-30, 5, 5);
  ellipse(mushroom3X+20, mushroom3Y-40, 20, 20);
}

//Draws Alice
void drawAlice() {

  noStroke();

  fill(255, 68, 41);
  triangle(aliceFeetX-6, aliceFeetY-78, aliceFeetX, aliceFeetY-88, aliceFeetX+6, aliceFeetY-80);
  triangle(aliceFeetX-6, aliceFeetY-78, aliceFeetX-15, aliceFeetY-80, aliceFeetX-10, aliceFeetY-74);

  fill(232, 187, 109);
  ellipse(aliceFeetX, aliceFeetY-67.5, 25, 25);
  triangle(aliceFeetX-12, aliceFeetY-73, aliceFeetX-14, aliceFeetY-52, aliceFeetX-5, aliceFeetY-70);
  quad(aliceFeetX-15, aliceFeetY-37, aliceFeetX+18, aliceFeetY-35, aliceFeetX+12, aliceFeetY-70, aliceFeetX-5, aliceFeetY-75);

  fill(255, 255, 132);
  quad(aliceFeetX, aliceFeetY-40, aliceFeetX+3, aliceFeetY-40, aliceFeetX+3, aliceFeetY-55, aliceFeetX+1, aliceFeetY-55);
  ellipse(aliceFeetX, aliceFeetY-65, 20, 20); 
  arc(aliceFeetX, aliceFeetY-60, 20, 12, PI-HALF_PI, TWO_PI-HALF_PI);

  fill(50);
  stroke(50);
  strokeWeight(1);
  ellipse(aliceFeetX-5, aliceFeetY-64, 2, 2);
  ellipse(aliceFeetX+2, aliceFeetY-64, 2, 2);
  line(aliceFeetX-4, aliceFeetY-64, aliceFeetX-7, aliceFeetY-65);
  line(aliceFeetX+2, aliceFeetY-64, aliceFeetX+5, aliceFeetY-65);
  line(aliceFeetX-3, aliceFeetY-58, aliceFeetX-1, aliceFeetY-56);
  line(aliceFeetX-1, aliceFeetY-56, aliceFeetX+1, aliceFeetY-58);

  noStroke();
  fill(232, 187, 109);
  triangle(aliceFeetX-5, aliceFeetY-80, aliceFeetX+3, aliceFeetY-76, aliceFeetX, aliceFeetY-64);
  triangle(aliceFeetX+3, aliceFeetY-75, aliceFeetX+12, aliceFeetY-70, aliceFeetX+10, aliceFeetY-48);

  fill(255, 255, 132);
  quad(aliceFeetX-8, aliceFeetY-45, aliceFeetX-5, aliceFeetY-38, aliceFeetX-5, aliceFeetY-20, aliceFeetX-10, aliceFeetY-20);
  quad(aliceFeetX+10, aliceFeetY-40, aliceFeetX+13, aliceFeetY-40, aliceFeetX+18, aliceFeetY-25, aliceFeetX+15, aliceFeetY-22);
  ellipse(aliceFeetX+18, aliceFeetY-23, 7, 5);

  fill(255, 68, 41);
  ellipse(aliceFeetX-4, aliceFeetY-45, 10, 10);
  ellipse(aliceFeetX+8, aliceFeetY-45, 10, 10);
  ellipse(aliceFeetX+2, aliceFeetY-40, 15, 15);
  arc(aliceFeetX+2, aliceFeetY-10, 30, 50, PI, TWO_PI);

  fill(255);
  triangle(aliceFeetX-1, aliceFeetY, aliceFeetX+2, aliceFeetY-10, aliceFeetX-4, aliceFeetY-10);
  triangle(aliceFeetX+7, aliceFeetY, aliceFeetX+4, aliceFeetY-10, aliceFeetX+10, aliceFeetY-10);
}

/////////////////////////////////////////////////////////////////////////////////////
//Pseudocode
/////////////////////////////////////////////////////////////////////////////////////

//1. Begin by setting a default frame rate and a size for the program.
//2. Draw the background then draw a tree.
//3. Keep drawing the tree over and over a certain amount apart until it hits the right side of the screen.
//4. Do step 4 for two more layers of trees.
//5. Draw a mushroom 3 times. 
//6. Draw Alice in the air.
//7. When Alice is in the air, let her fall downwards at a constant speed. But if she is not falling, then she is probably rising into the air.
//8. If Alice hits the ground then she stays on the ground and the line ‘Game Over!’ is displayed. 
//9. If the D button is pressed Alice moves right by increasing her value.
//10. If the A button is pressed Alice moves left by decreasing her value.
//11. Check Alice is trying to move off screen to left (or right). If so then put her to the left (or right) edge of the screen.
//12. When Alice touches the top of a mushroom, her decent stops and she begins to ascend at a random speed. 
//13. Once Alice reaches a a random height, she begins to fall again.