Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/******************************************************************
* File Name: dodgeTheThings
* Author: Maddi McDougall
* Date: Oct 7, 2015
* Description: The user can move the player square up and down (by
* pressing W to jump or by letting gravity take its course). The 
* goal is to dodge the stars shooting across the screen. If the
* player collides with one the toy is reset. If the player collides
* with the bottom of the screen they bounce up. Have fun!
******************************************************************/

//*User Defined Variables:*****************************************************************//

/**************************************
 *  Player Variables:
 *  Player size, player's x and y 
 *  position, player velocity, jump 
 *  magnitude, gravity (only affects
 *  player), variable for player jumping
 *  (moving up)
 ***************************************/
int playerSize = 12;
int playerPositionX = 30;
float playerPositionY = 30;
float playerVelocity = 0;
float playerJumpAcceleration = 0.2;
float gravity = 0.4;
boolean playerMovingUp = false;

/**************************************
 *  Player-Star Collision Variable:
 *  Used to determine if the player has
 *  collided with a star.
 ***************************************/
boolean playerStarCollision = false;

/**************************************
 *  Star Variables:
 *  Star size, initial star speed, star 
 *  acceleration
 ***************************************/
int starSize = 6;
float starVelocity = 2;
float starAcceleration = 0.005;

/**************************************
 *  Variables for Star 1:
 *  Starting colour, X, and Y positions
 ***************************************/
int star01ColourR = 255;
int star01ColourG = 0;
int star01ColourB = 0;
float star01PositionX = 400;
int star01PositionY = 0;

/**************************************
 *  Variables for Star 2:
 *  Starting colour, X, and Y positions
 ***************************************/
int star02ColourR = 255;
int star02ColourG = 255;
int star02ColourB = 0;
float star02PositionX = 500;
int star02PositionY = 0;

/**************************************
 *  Variables for Star 3:
 *  Starting colour, X, and Y positions
 ***************************************/
int star03ColourR = 255;
int star03ColourG = 255;
int star03ColourB = 0;
float star03PositionX = 600;
int star03PositionY = 0;

/**************************************
 *  Variables for Star 4:
 *  Starting colour, X, and Y positions
 ***************************************/
int star04ColourR = 0;
int star04ColourG = 255;
int star04ColourB = 0;
float star04PositionX = 700;
int star04PositionY = 0;


//*Non-User Defined Functions:*************************************************************//

/********************************************************
 *  Setup:
 *  Sets screen size, no outline, frame rate set to 30fps
 ********************************************************/
void setup() {
  size(400, 200);
  noStroke();
  frameRate(30);
}

/********************************************************
 *  Draw:
 *  Creates a background and then calls the function to
 *  draw the more detailed background overtop of it.
 *
 *  Calls the functions to move the player, check if the
 *  player has collided with the screen boundaries, and
 *  draw the player.
 *  
 *  Calls the functions to move the stars, check if they 
 *  need to be reset, and display the stars.
 *  Updates the stars' velocity.
 *  
 *  Calls the function to check if the player has collided
 *  with a star, and then if that function determines it
 *  to be true, the next function resets everything.
 ********************************************************/
void draw() {
  background(10);
  drawBackground();

  movePlayer(playerMovingUp);
  checkPlayerScreenCollisions();
  drawPlayer(playerPositionY);

  moveStar();
  checkStarReset();
  displayStars();
  starVelocity = starVelocity + starAcceleration;
  checkPlayerStarCollisions();
  resetIfCollisionDetected();
}


//*User Defined Functions:*****************************************************************//

/********************************************************
 *  Check Star Reset:
 *  Checks if any of the stars have gone outside of the
 *  screen's boundaries on the left side.
 *  If they do, it resets them to the right side so they
 *  can travel across the screen again.
 ********************************************************/
void checkStarReset() {
  if (star01PositionX < -starSize*5) {
    resetStar(1);
    assignRandomStarColour(1);
    assignRandomYPosition(1);
  } 
  if (star02PositionX < -starSize*5) {
    resetStar(2);
    assignRandomStarColour(2);
    assignRandomYPosition(2);
  } 
  if (star03PositionX < -starSize*5) {
    resetStar(3);
    assignRandomStarColour(3);
    assignRandomYPosition(3);
  }
  if (star04PositionX < -starSize*5) {
    resetStar(4);
    assignRandomStarColour(4);
    assignRandomYPosition(4);
  }
}

/********************************************************
 *  Assign Random Star Colour:
 *  Generates a random (primarily blue) colour.
 *  Checks the starNumber passed in and changes that 
 *  star's colour accordingly. This gives the appearance
 *  of many stars instead of four perpetually looping ones.
 ********************************************************/
void assignRandomStarColour(int starNumber) {
  //The random perameters are set so that the colour generated is
  //in the blue colour range.
  int starColourR = int(random(60, 125));
  int starColourG = int(random(80, 255));
  int starColourB = int(random(220, 255));

  //Looks for which star needs to be changed, changes it accordingly
  if (starNumber == 1) {
    star01ColourR = starColourR;
    star01ColourG = starColourG;
    star01ColourB = starColourB;
  } else if (starNumber == 2) {
    star02ColourR = starColourR;
    star02ColourG = starColourG;
    star02ColourB = starColourB;
  } else if (starNumber == 3) {
    star03ColourR = starColourR;
    star03ColourG = starColourG;
    star03ColourB = starColourB;
  } else if (starNumber == 4) {
    star04ColourR = starColourR;
    star04ColourG = starColourG;
    star04ColourB = starColourB;
  }
}

/********************************************************
 *  Move Star:
 *  Adds the star's speed to it's position. All stars move
 *  at the same speed and to the left.
 ********************************************************/
void moveStar() {
  star01PositionX = star01PositionX - starVelocity;
  star02PositionX = star02PositionX - starVelocity;
  star03PositionX = star03PositionX - starVelocity;
  star04PositionX = star04PositionX - starVelocity;
}

/********************************************************
 *  Assign Random Y Position:
 *  Checks the starNumber passed in and changes that 
 *  star's Y position to a random value between 0 and the
 *  height minus the star's size. This keeps the star from
 *  being positioned below the screen (because the fire's
 *  rectangles are drawn from the top corner).
 ********************************************************/
void assignRandomYPosition(int starNumber) {
  if (starNumber == 1) {
    star01PositionY = int(random(0, height-starSize));
  } else if (starNumber == 2) {
    star02PositionY = int(random(0, height-starSize));
  } else if (starNumber == 3) {
    star03PositionY = int(random(0, height-starSize));
  } else if (starNumber == 4) {
    star04PositionY = int(random(0, height-starSize));
  }
}

/********************************************************
 *  Reset Star:
 *  Checks the starNumber passed in and changes that 
 *  star's X position to the right side (width) of the
 *  screen. This causes the stars to loop from one right
 *  to left indefinitely.
 ********************************************************/
void resetStar(int starNumber) {
  if (starNumber == 1) {
    star01PositionX = width;
  } else if (starNumber == 2) {
    star02PositionX = width;
  } else if (starNumber == 3) {
    star03PositionX = width;
  } else if (starNumber == 4) {
    star04PositionX = width;
  }
}

/********************************************************
 *  Displays Stars:
 *  Calls the drawStars functions and passes the 
 *  appropriate arguments into them.
 ********************************************************/
void displayStars() {
  drawStar01(star01ColourR, star01ColourG, star01ColourB, star01PositionX, star01PositionY);
  drawStar02(star02ColourR, star02ColourG, star02ColourB, star02PositionX, star02PositionY);
  drawStar03(star03ColourR, star03ColourG, star03ColourB, star03PositionX, star03PositionY);
  drawStar04(star04ColourR, star04ColourG, star04ColourB, star04PositionX, star04PositionY);
}

/********************************************************
 *  Draw Star 1:
 *  Creates a series of squares for the 'star'. Every
 *  value is passed in (except for the alpha fill value)
 *  from the DisplayStars function.
 ********************************************************/
void drawStar01(int r, int g, int b, float x, int y) {
  /*RGB vaules are generated by the assignRandomStarColour function
   * x is determined by the moveStar and resetStar functions
   * y is determined by the assignRandomYPosition function
   * Star size is determined in the global variables at the top */

  fill(r, g, b);
  rect(x, y, starSize, starSize);

  fill(r, g, b, 127);
  rect(x+starSize, y, starSize, starSize);

  fill(r, g, b, 63);
  rect(x+2*(starSize), y, starSize, starSize);

  fill(r, g, b, 31);
  rect(x+3*(starSize), y, starSize, starSize);

  fill(r, g, b, 15);
  rect(x+4*(starSize), y, starSize, starSize);
}

/********************************************************
 *  Draw Star 2:
 *  Creates a series of squares for the 'star'. Every
 *  value is passed in (except for the alpha fill value)
 *  from the DisplayStars function.
 ********************************************************/
void drawStar02(int r, int g, int b, float x, int y) {
  /*RGB vaules are generated by the assignRandomStarColour function
   * x is determined by the moveStar and resetStar functions
   * y is determined by the assignRandomYPosition function
   * Star size is determined in the global variables at the top */

  fill(r, g, b);
  rect(x, y, starSize, starSize);

  fill(r, g, b, 127);
  rect(x+starSize, y, starSize, starSize);

  fill(r, g, b, 63);
  rect(x+2*(starSize), y, starSize, starSize);

  fill(r, g, b, 31);
  rect(x+3*(starSize), y, starSize, starSize);

  fill(r, g, b, 15);
  rect(x+4*(starSize), y, starSize, starSize);
}

/********************************************************
 *  Draw Star 3:
 *  Creates a series of squares for the 'star'. Every
 *  value is passed in (except for the alpha fill value)
 *  from the DisplayStars function.
 ********************************************************/
void drawStar03(int r, int g, int b, float x, int y) {
  /*RGB vaules are generated by the assignRandomStarColour function
   * x is determined by the moveStar and resetStar functions
   * y is determined by the assignRandomYPosition function
   * Star size is determined in the global variables at the top */

  fill(r, g, b);
  rect(x, y, starSize, starSize);

  fill(r, g, b, 127);
  rect(x+starSize, y, starSize, starSize);

  fill(r, g, b, 63);
  rect(x+2*(starSize), y, starSize, starSize);

  fill(r, g, b, 31);
  rect(x+3*(starSize), y, starSize, starSize);

  fill(r, g, b, 15);
  rect(x+4*(starSize), y, starSize, starSize);
}

/********************************************************
 *  Draw Star 4:
 *  Creates a series of squares for the 'star'. Every
 *  value is passed in (except for the alpha fill value)
 *  from the DisplayStars function.
 ********************************************************/
void drawStar04(int r, int g, int b, float x, int y) {
  /*RGB vaules are generated by the assignRandomStarColour function
   * x is determined by the moveStar and resetStar functions
   * y is determined by the assignRandomYPosition function
   * Star size is determined in the global variables at the top */
  fill(r, g, b);
  rect(x, y, starSize, starSize);

  fill(r, g, b, 127);
  rect(x+starSize, y, starSize, starSize);

  fill(r, g, b, 63);
  rect(x+2*(starSize), y, starSize, starSize);

  fill(r, g, b, 31);
  rect(x+3*(starSize), y, starSize, starSize);

  fill(r, g, b, 15);
  rect(x+4*(starSize), y, starSize, starSize);
}

/********************************************************
 *  Draw Background:
 *  Uses a loop to create a gradient effect. The values
 *  for r, g, and b are hard-coded based on a linear eq'n 
 *  that I determined after picking colours in Photoshop.
 *  Uses several loops to draw triangles (mountains)
 *  at the bottom of the screen.
 *  Adds a line behind the player to show that they can
 *  only move up and down.
 ********************************************************/
void drawBackground() {
  //Sky gradient
  for (int y = 0; y <= height; y++) {
    float r = 1.7;
    float g = 0.24;
    float b = 1.78;
    fill(9+y*r, 7+y*g, 14+y*b);
    rect(0, y*5, width, 5);
  }
  //Mountains
  for (int x = -10; x <= width; x=x+90) {
    fill(9, 7, 14);
    triangle(x, height, x+30, height-40, x+65, height);
  }
  //Mountains
  for (int x2 = 0; x2 <= width; x2=x2+105) {
    fill(9, 7, 14);
    triangle(x2, height, x2+40, height-60, x2+80, height);
  }
  //Mountains
  for (int x3 = -5; x3 <= width; x3=x3+59) {
    fill(9, 7, 14);
    triangle(x3, height, x3+30, height-25, x3+60, height);
  }
  //Line
  fill(255, 255, 255, 20);
  rect(playerPositionX+(playerSize/2)-1, 0, 2, height);
}

/********************************************************
 *  Key Pressed:
 *  Checks to see if the appropriate key is pressed. 
 *  Toggles the playerMovingUp accordingly.
 ********************************************************/
void keyPressed() {
  if (key == 'w' || key == 'W') {
    playerMovingUp = true;
  } else {
    playerMovingUp = false;
  }
}

/********************************************************
 *  Key Released:
 *  Checks to see if the appropriate key is released. 
 *  Toggles the playerMovingUp to false.
 ********************************************************/
void keyReleased() {
  if (key == 'w' || key == 'W') {
    playerMovingUp = false;
  }
}

/********************************************************
 *  Move Player:
 *  If the player is moving up, adds the jump acceleration
 *  to the player's velocity. Updates the position based
 *  on this new value.
 *  Otherwise, gravity is added to the player's velocity
 *  and their position is updated accordingly.
 ********************************************************/
void movePlayer(boolean movingUp) {
  if (movingUp) {
    playerVelocity = playerVelocity - 2 + playerJumpAcceleration;
    playerPositionY = playerPositionY + playerVelocity;
  } else {
    playerVelocity = playerVelocity + gravity;
    playerPositionY = playerPositionY + playerVelocity;
  }
}

/********************************************************
 *  Draw Player:
 *  Displays the player. Takes in the player's current
 *  calculated y position. Size is based on playerSize.
 ********************************************************/
void drawPlayer(float y) {
  //Body
  fill(255);
  rect(playerPositionX, y, playerSize, playerSize);
  //Eyes
  fill(0);
  rect(playerPositionX + (playerSize*1/6), y + 6, (playerSize*1/6), (playerSize*2/6));
  rect(playerPositionX + (playerSize*4/6), y + 6, (playerSize*1/6), (playerSize*2/6));
}

/********************************************************
 *  Check Player-Screen Collisions:
 *  If the player reaches the top of the screen their
 *  velocity and position are reset (so they don't bounce
 *  off of the ceiling).
 *  If the player reaches the bottom their position is
 *  reset (so they don't pass through the screen) and
 *  their velocity is inverted so they 'bounce' off of the
 *  ground.
 ********************************************************/
void checkPlayerScreenCollisions() {
  if (playerPositionY < 0) {
    playerVelocity = 0;
    playerPositionY = 0;
  } else if (playerPositionY+playerSize > height) {
    playerPositionY=height-playerSize;
    playerVelocity = -playerVelocity;
  }
}

/********************************************************
 *  Check Player-Star Collisions:
 *  Determines if the player's shape has collided with one
 *  of the stars'. Collisions with all stars have the same
 *  result. The collision calculation only takes the first
 *  square in the star's shape (because the other squares
 *  act as a trail).
 ********************************************************/
void checkPlayerStarCollisions() {
  if (playerPositionX + playerSize >= star01PositionX && playerPositionX <= star01PositionX + starSize
    && playerPositionY + playerSize >= star01PositionY && playerPositionY <= star01PositionY + starSize) {
    playerStarCollision = true;
  } else if (playerPositionX + playerSize >= star02PositionX && playerPositionX <= star02PositionX + starSize
    && playerPositionY + playerSize >= star02PositionY && playerPositionY <= star02PositionY + starSize) {
    playerStarCollision = true;
  } else if (playerPositionX + playerSize >= star03PositionX && playerPositionX <= star03PositionX + starSize
    && playerPositionY + playerSize >= star03PositionY && playerPositionY <= star03PositionY + starSize) {
    playerStarCollision = true;
  } else if (playerPositionX + playerSize >= star04PositionX && playerPositionX <= star04PositionX + starSize
    && playerPositionY + playerSize >= star04PositionY && playerPositionY <= star04PositionY + starSize) {
    playerStarCollision = true;
  } else {
    playerStarCollision = false;
  }
}

/********************************************************
 *  Reset If Collisions Detected:
 *  Checks if playerStarCollision is true, and resets
 *  the player and stars to the initialized values. (To
 *  create a "new game".) After that it toggles
 *  playerStarCollision to false to start the new game.
 ********************************************************/
void resetIfCollisionDetected() {
  if (playerStarCollision) {
    //Reset player variables
    playerPositionY = 30;
    playerVelocity = 0;
    playerMovingUp = false;

    //Reset star velocity and acceleration
    starVelocity = 2;
    starAcceleration = 0.005;

    //Reset star 1 to initial values
    star01ColourR = 255;
    star01ColourG = 0;
    star01ColourB = 0;
    star01PositionX = 400;
    star01PositionY = 0;

    //Reset star 2 to initial values
    star02ColourR = 255;
    star02ColourG = 255;
    star02ColourB = 0;
    star02PositionX = 500;
    star02PositionY = 0;

    //Reset star 3 to initial values
    star03ColourR = 255;
    star03ColourG = 255;
    star03ColourB = 0;
    star03PositionX = 600;
    star03PositionY = 0;

    //Reset star 4 to initial values
    star04ColourR = 0;
    star04ColourG = 255;
    star04ColourB = 0;
    star04PositionX = 700;
    star04PositionY = 0;

    //Reset colission status
    playerStarCollision = false;
  }
}