Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/****************************************************************************
By Xinran Ma
October 4th, 2017
Welcome to Maze Dash. Get to the blue goal at the end for a point. 
Avoid walls and white squares. Controls are W/A/S/D

(if you can get a score higher than 5, literally you are god.)
****************************************************************************/

//Player variables
float playerX = 310;
float playerY = 375;
float playerXDirect = 0;
float playerYDirect = 0;

//Projectile square variables
float squareX = 0;
float squareY = 200;

//Score count
int score = 0;

//I set up the project and print a brief of the game
void setup () {
  size(400, 400);
  background(0);
  frameRate(60);
  
  ellipseMode(CENTER);
  noStroke();
  println( "Welcome to Maze Dash. Get to the blue goal at the end for a point. Avoid walls and white squares!" );
  println("Controls: W/A/S/D to move Player");
}

/*
Where I execute functions. I execute the collision/update ones first
so that the calculations and rule checking can be done in advance.
(hard to explain, should be self explanatory)
*/
void draw () {
  drawBackground();
  wallCollision();
  squareCollision();
  goalReset();
  updateSquare();
  updatePlayer();

  drawGrid();
  drawWalls();
  drawGoal();
  drawPlayer();
  drawSquare();
}

//Background
void drawBackground() {
  rectMode(CORNER);
  fill(232, 245, 247);
  rect(0, 0, 400, 400);
}

//Obligatory loop for pattern
//Drawing a vertical line every 10 pixels
void drawGrid() {
  stroke(255);
  int x = 0;
  while(x<width){
    line(x,0,x,height);
    x = x+10; }
  }

//Walls made out of rectangles
void drawWalls() {
  fill(245, 255, 234);
  noStroke();
  rectMode(CORNERS);
  rect(0, 0, 60, 400);
  rect(340, 0, 400, 400);
  rect(10, 360, 280, 400);
  rect(120, 240, 370, 300);
  rect(10, 120, 280, 180);
  rect(120, 0, 370, 60);
}

//Blue Goal rectangle
void drawGoal() {
  fill(188, 236, 242);
  rect(60, 0, 120, 20);
}

//Drawing player
void drawPlayer() {
  fill(188, 236, 242);
  ellipse(playerX, playerY, 35, 35);
}

//Update player, setting speed (5) and direction (positive, negative)
void updatePlayer() {
  playerX = playerX+5 * playerXDirect;
  playerY = playerY+5 * playerYDirect;
}

//Drawing square
/* (fun fact I was contemplating there to be multiple of these
but it didn't make for very encouraging gameplay so I left it out intentionally) */
void drawSquare() {
  fill(255);
  rectMode(CENTER);
  rect(squareX, squareY, 30, 30);
}

//Updating square, setting speed (8), randomly generating where
//along the y-axis they spawn
void updateSquare() {
  squareX += 8; 
  if (squareX >=400) {
    squareY = random(0, 400);
    squareX = 0;
  }
}

//If any instance of player entering "wall area", they are sent back
//to the spawn area and lose one point if they already have accumulated some.
void wallCollision(){
  if ( playerX>340 | playerX<60 | playerX<280 & playerY>360 | playerY>240 & playerY<300 & playerX>120 
  | playerX<280 & playerY<180 & playerY>120 | playerX>120 & playerY<60 | playerY>400 ){
    playerX = 310;
    playerY = 375;
    if (score > 0){
      score = score-1;
      println("Score", score);
    }
  }
}

//Testing if square collides within player position's 30px radius.
//If they collide, player loses one point and is respawned
void squareCollision(){
  if ( squareX >= (playerX-30) & squareX <= (playerX+30) & squareY >= (playerY-30) & squareY <= (playerY+30) ){
    playerX = 310;
    playerY = 375;
    if (score > 0){
      score = score-1;
      println("Score", score);
    }
  }
}

//If the player gets to the height of the goal, they are "looped back" to the
//respawn point. They get a point.
void goalReset(){
  if (playerY<20){
    playerX = 310;
    playerY = 375;
    score = score + 1;
    println("Score", score);
  }
}

//WASD controls for direction
void keyPressed() {
  if (key == 'w') {
    playerYDirect = -1;
  }
  if (key == 's') {    
    playerYDirect = 1;
  }
  if (key == 'a') {
    playerXDirect = -1;
  }
  if (key == 'd') {
    playerXDirect = 1;
  }
}

//Releasing a key makes that axis immobile. 
//You only go in one direction, unless you press two buttons at once
//Stops if you don't press anything.
void keyReleased() {
  if (key == 'w') { 
    playerYDirect = 0;
  } else if (key == 's') {
    playerYDirect = 0;
  } else if (key == 'a') {
    playerXDirect = 0;
  } else if (key == 'd') {
    playerXDirect = 0;
  }
}