Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
//PING//

/*

 INTERACTIVE MEDIA COMPUTATION 
 DEAN ELLIOTT
 OCT. 3, 2017
 
 Pressing "START" initiates a pong-esque interactive toy.  Movement of the cursor readjusts the racket position. Use this mechanic to keep the target up!
 */


// Variables


// Racket 
float racketWidth = 50;
float racketHeight = 7;
float racketX = 200;
float racketY = 175+160;
float leeway = 6;


// Target
float gravity = .1;
float fallspeed = 5;
float velocity = 8;
float xspeed = 5;
float xspeedInc = .6;
float xPos = 75;
float yPos = 0;
float trgtX = (int) random (0, 400);
color trgtClr=255;
int trgtSizeL = 25;
int trgtSizeReg = 15;
int trgtSize = trgtSizeReg;
int trgtSizeInc = 1;


// Score 
int score = 0;


// Menu 
boolean menu = false;
boolean play = false;


// Setup
void setup() {
  size(400, 400);
  frameRate(60);
  rectMode(CENTER);
  ellipseMode(CENTER);
  noStroke();
}



// Draw
void draw() { 

  if (menu ==  false) {
    title();
  }

  if (play == true) {
    drawBackground();
    updateRacket();
    drawRacket();
    checkCollisions();
    drawTrgt();
    updateTrgt();
    drawScore();
    respawn();
  }
}



// Background
void drawBackground() {
  background(172, 215, 243);
  rectMode(CENTER);
  fill (255);
  rect(200, 180, 250, 300);
  fill(124, 173, 145);
  rect(140, 180, 115, 290);
  rect(260, 180, 115, 290);
  fill(205);
  rectMode(CORNER);
  rect(75, 330, 250, 15);
  fill(194, 154, 95);
  rect(125, 345, 15, 45);
  rect(270, 345, 15, 45);
  rectMode(CENTER);
  rect(200, 365, 150, 5);
}



// Update Racket
void updateRacket() {
  if (mouseX < .5 * racketWidth) {
    racketX = .5 * racketWidth;
  } else if (mouseX > width - (.5 * racketWidth)) {
    racketX = width - (.5 * racketWidth);
  } else {
    racketX = mouseX;
  }
}



// Draw Racket
void drawRacket() {
  rectMode(CENTER);
  noStroke();
  fill(244, 219, 174);
  rect(mouseX-15, racketY, 65, 15);
  fill(226, 151, 139);
  rect(mouseX, racketY, 30, 45);
  rect(mouseX, racketY, 45, 30);
}



// Update Target
void updateTrgt() {
  fallspeed += gravity;
  yPos += fallspeed;
  xPos += xspeed;

  if (trgtSize != trgtSizeReg) {
    trgtSize -= trgtSizeInc;
  }
}



// Draw Target
void drawTrgt() {
  fill(trgtClr);
  rect(xPos, yPos, trgtSize, trgtSize);
}



// Collisions
void checkCollisions() {
  if (
    //Target hits racket
    yPos > racketY && yPos < racketY + (fallspeed * 2) 
    && xPos < racketX + (racketWidth/2) + leeway && xPos > racketX - (racketWidth/2) - leeway // if the X coordinates match
    ) {
    yPos = racketY - (racketHeight/2); 
    xspeed += xspeedInc; // increase speed
    fallspeed = -velocity; // reverse direction
    score ++; // increase score
    trgtSize = trgtSizeL; // Target increases when hit by racket
    trgtClr = color (random(100, 233), random(134, 143), random(100, 233));
  } else if (
    // if the ball hits the ground
    yPos > height
    ) {
  }

  //When the target hits any wall, the direction is reversed, speed is inverted. 
  if (xPos > width || xPos < 0) {

    xspeed *= -1; // direction
    xspeedInc *= -1; // speed 
    // invert x position 
    if (xspeed < 0) {
      xPos = (width - (xPos-width));
    } else if (xspeed > 0) {
      xPos = -xPos;
    }
  }
}



// Score 
void drawScore() {
  textSize(40);
  text(0+score, 20, 200);
}



// Respawn. When the target passes the racket, targets position and score are reset. 
void respawn() {
  if (yPos >= height) {
    xPos=(int) random (0, 400); //Target falls from random postions along X-axis. 
    yPos=0;
    fallspeed = 5;
    xspeed = 5;
    xspeedInc = .6;
    score = 0;
    trgtClr = 255;
  }
}



// Title screen that begins the project.
void title() {
  background(172, 215, 243);
  textSize(150);
  text ("PING", 30, 150);
  rectMode(CORNERS);
  fill(205);
  rect(120, 260, 280, 310);
  fill(255);
  textSize(40);
  text ("START", 140, 300);
}

// Hit box that initiates the game.
void mouseClicked() {
  if (mouseX >= 120 && mouseX <= 260 && mouseY >= 280 && mouseY <= 310) {
    menu = false;
    play = true;
  }
}



/* 
 
 REFERENCES 
 The projects listed below are credited to their creators, respectively. They assisted by demonstrating various function abilities.  
 
 
 
 //Establishing variables, movement/collision (Used for Racket, Target)
 //http://www-acad.sheridanc.on.ca/PROG14998/2014/interactive-toy/interactive_toy_66/index.html
 
 //Random colours (Used for Target, Score)
 http://www-acad.sheridanc.on.ca/PROG14998/2016/interactive-toy/jordan_goulbourne_interactive_toy/index.html
 
 //Gravity, velocity, movement (Used for Racket)
 http://www-acad.sheridanc.on.ca/PROG14998/2015/interactive-toy/interactive_toy_19/index.html#
 
 //Score counter 
 http://www-acad.sheridanc.on.ca/PROG14998/2014/interactive-toy/interactive_toy_06/index.html
 
 //Hit box registration (Used for Menu/Title)
 http://www-acad.sheridanc.on.ca/PROG14998/2015/interactive-toy/interactive_toy_30/index.html
 
 
 
 */