//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// INTERACTIVE TOY ////////////////////////////////////
//////////////////// Shadow Monsters Attack ///////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////// Shirley Tong ///////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//// It seems that you are trapped in a room with several shadow monsters ////
//// Use the WASD keys to avoid them for as long as possible ////
//// If you're lucky, maybe they won't eat you tonight ////
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
//monster one's starting position on X would be random
float monsterOneAnchorPointX;
//monster one's starting position on Y would be random
float monsterOneAnchorPointY;
//size of the monster one width wise
int monsterOneSizeX;
//size of the monster one height wise
int monsterOneSizeY;
//speed of monster one
float monsterOneSpeed;
//monster two's starting position on X would be random
float monsterTwoAnchorPointX;
//monster two's starting position on Y would be random
float monsterTwoAnchorPointY;
//size of the monster two width wise
int monsterDirectionX;
//size of the monster two height wise
int monsterDirectionY;
//speed of monster two
float monsterTwoSpeed;
//player's starting position on X
float playerAnchorPointX;
//player's starting position on Y
float playerAnchorPointY;
//player's width
int playerSizeX;
//player's height
int playerSizeY;
//this int is to calculate the steps player has taken, which will help animate player's feet
int playerStep;
boolean legMove;
boolean goUp;
boolean goDown;
boolean goLeft;
boolean goRight;
boolean gameOver;
//the background square one
float randomOne;
//the background square two
float randomTwo;
//the background darkerner when player is touched
int shading;
//used for testing if functions worked
int test;
//basic setup
void setup() {
//stating our variables
monsterOneAnchorPointX = random(0, 350);
monsterOneAnchorPointY = random(0, 350);
monsterOneSizeX = 35;
monsterOneSizeY = 70;
monsterOneSpeed = 0.015;
monsterTwoAnchorPointX = random(50, 300);
monsterTwoAnchorPointY = random(50, 300);
monsterDirectionX = 1;
monsterDirectionY = 1;
monsterTwoSpeed = 4;
playerAnchorPointX = 200;
playerAnchorPointY = 200;
playerSizeX = 35;
playerSizeY = 35;
playerStep = 0;
legMove = false;
goUp = false;
goDown = false;
goLeft = false;
goRight = false;
gameOver = false;
randomOne = 245;
randomTwo = 255;
shading = 0;
test = 0;
size(400, 400);
smooth();
noStroke();
}
//draw function made cleaner with homemade functions
void draw() {
//the game starts
if (gameOver == false) {
backgroundChange();
wallConstraint();
playerMove();
updateLegs();
drawPlayer();
damageTakenOne();
damageTakenTwo();
monsterOneMove();
drawMonsterOne();
monsterTwoMove();
drawMonsterTwo();
gameOverScreen();
//stating that if the game is over
} else if (gameOver == true) {
background (0);
fill(255, 0, 0);
textAlign (CENTER, CENTER);
textSize (20);
text("YOU'VE BEEN DEVOURED\n PRESS 'K' TO BE KILLED AGAIN", width/2, height/2);
}
}
//to create tiles for the background
void backgroundChange() {
//creates a limit for width and height
for (int i = 0; i <= width; i = i+50) {
for (int k = 0; k <= height; k = k+50) {
rectMode(CORNER);
//when shading increases, it will subtract from random one and two, making it dark until black
fill(random(randomOne - shading, randomTwo - shading));
rect(i, k, 50, 50);
}
}
}
//////////////////////////////////////////////
//////// PLAYER DESIGN /////////
//////////////////////////////////////////////
//draws and create player character
void drawPlayer() {
//head
fill(255);
ellipse(playerAnchorPointX, playerAnchorPointY-30, 25, 25);
quad(playerAnchorPointX-2, playerAnchorPointY-20, playerAnchorPointX+2, playerAnchorPointY-20, playerAnchorPointX+5, playerAnchorPointY+2, playerAnchorPointX-5, playerAnchorPointY+2);
}
//the legs of the player in standing still position
void drawPlayerWait() {
//legs
fill(255);
quad(playerAnchorPointX+1, playerAnchorPointY+2, playerAnchorPointX+5, playerAnchorPointY+2, playerAnchorPointX+4, playerAnchorPointY+12, playerAnchorPointX+2, playerAnchorPointY+12);
quad(playerAnchorPointX-1, playerAnchorPointY+2, playerAnchorPointX-5, playerAnchorPointY+2, playerAnchorPointX-4, playerAnchorPointY+12, playerAnchorPointX-2, playerAnchorPointY+12);
}
////////////////////////////////////
///// LEG MOVEMENTS //////
////////////////////////////////////
//the legs of the player in with one leg up
void drawPlayerLegMoveOne() {
//legs
fill(255);
//the left foot goes up
quad(playerAnchorPointX+1, playerAnchorPointY-1, playerAnchorPointX+5, playerAnchorPointY-1, playerAnchorPointX+4, playerAnchorPointY+9, playerAnchorPointX+2, playerAnchorPointY+9);
quad(playerAnchorPointX-1, playerAnchorPointY+2, playerAnchorPointX-5, playerAnchorPointY+2, playerAnchorPointX-4, playerAnchorPointY+12, playerAnchorPointX-2, playerAnchorPointY+12);
}
//the legs of the player in with the other leg up
void drawPlayerLegMoveTwo() {
//legs
fill(255);
quad(playerAnchorPointX+1, playerAnchorPointY+2, playerAnchorPointX+5, playerAnchorPointY+2, playerAnchorPointX+4, playerAnchorPointY+12, playerAnchorPointX+2, playerAnchorPointY+12);
//right foot goes up
quad(playerAnchorPointX-1, playerAnchorPointY-1, playerAnchorPointX-5, playerAnchorPointY-1, playerAnchorPointX-4, playerAnchorPointY+9, playerAnchorPointX-2, playerAnchorPointY+9);
}
void updateLegs() {
if (legMove == false)
{
drawPlayerWait();
}
//IF KEY IS PRESSED, THEN DISPLAY EITHER WALKING MODE BASED ON THE STEPS
if (legMove == true)
{
//basically, if the remainder of the steps are less than 20, then that displays one foot up, if it is greater, than the other foot is displayed
if (playerStep%40<20)
{
//if the remainder is less than 20, lift one leg up
drawPlayerLegMoveOne();
} else
{
//if the remainder is greater than 20, lift the other leg up
drawPlayerLegMoveTwo();
}
}
}
//////////////////////////////////////////////
//////// DAMAGE RATER /////////
//////////////////////////////////////////////
//when the monster approaches the player within its space, the screen is darked to show damage
void damageTakenOne() {
//this helps figure out when the monster is touching the player
//if the monster approachs the player within these coodinates, then...
if (monsterOneAnchorPointX - playerAnchorPointX >= -40 && monsterOneAnchorPointX - playerAnchorPointX <= 10 && monsterOneAnchorPointY - playerAnchorPointY >= -105 && monsterOneAnchorPointY - playerAnchorPointY <= 10) {
//the shading increases each time the monster hits the player
shading+=2;
//the shading helps darken the screen
}
}
//when the monster approaches the player within its space, the screen is darked to show damage
void damageTakenTwo() {
//this helps figure out when the monster is touching the player
//if the monster approachs the player within these coodinates, then...
if (monsterTwoAnchorPointX - playerAnchorPointX >= -95 && monsterTwoAnchorPointX - playerAnchorPointX <= 10 && monsterTwoAnchorPointY - playerAnchorPointY >= -100 && monsterTwoAnchorPointY - playerAnchorPointY <= 10) {
//the shading increases each time the monster hits the player
shading+=2;
//the shading helps darken the screen
}
}
//////////////////////////////////////////////
//////// MONSTER DESIGN /////////
//////////////////////////////////////////////
///// MONSTER ONE //////
////////////////////////////////////
//design of the monster one
void drawMonsterOne() {
fill(0);
//head
ellipse(monsterOneAnchorPointX+15, monsterOneAnchorPointY+15, 30, 30);
//body
quad(monsterOneAnchorPointX+13, monsterOneAnchorPointY+25, monsterOneAnchorPointX+17, monsterOneAnchorPointY+25, monsterOneAnchorPointX+19, monsterOneAnchorPointY+60, monsterOneAnchorPointX+11, monsterOneAnchorPointY+60);
//legs
quad(monsterOneAnchorPointX+12, monsterOneAnchorPointY+60, monsterOneAnchorPointX+13, monsterOneAnchorPointY+60, monsterOneAnchorPointX+13, monsterOneAnchorPointY+70, monsterOneAnchorPointX+12, monsterOneAnchorPointY+70);
quad(monsterOneAnchorPointX+17, monsterOneAnchorPointY+60, monsterOneAnchorPointX+18, monsterOneAnchorPointY+60, monsterOneAnchorPointX+18, monsterOneAnchorPointY+70, monsterOneAnchorPointX+17, monsterOneAnchorPointY+70);
//the mouth
fill(255);
arc(monsterOneAnchorPointX+15, monsterOneAnchorPointY+19, 25, 32, -PI, 0);
//this is the other arc to help darken the white part of the mouth, making it frown
fill(0);
arc(monsterOneAnchorPointX+15, monsterOneAnchorPointY+20, 26, 25, -PI, 0);
}
//the movement of monster one is based on the where the last position of the player is multiplied by the speed
void monsterOneMove() {
//for the monster to follow the player, last position of the monster and player together, where player is subtracted by the last position of the monster, which is then multipled by the speed
//we add the monster with the player position because we want the monster to constantly add itself so it is in the last position of the player
//the reason why we subtract player from monster is because if we left it alone, then the monster would automatically go to player, so we add '-monster' because we want it to follow
monsterOneAnchorPointX = monsterOneAnchorPointX + (playerAnchorPointX - monsterOneAnchorPointX) * monsterOneSpeed;
monsterOneAnchorPointY = monsterOneAnchorPointY + (playerAnchorPointY - monsterOneAnchorPointY) * monsterOneSpeed;
}
////////////////////////////////////
///// MONSTER TWO //////
////////////////////////////////////
//design of the monster one
void drawMonsterTwo() {
//legs
fill(0);
arc(monsterTwoAnchorPointX+20, monsterTwoAnchorPointY+55, 30, 45, -PI, -HALF_PI);
arc(monsterTwoAnchorPointX+70, monsterTwoAnchorPointY+55, 30, 45, -HALF_PI, 0);
fill(0);
arc(monsterTwoAnchorPointX+48, monsterTwoAnchorPointY+58, 30, 45, -HALF_PI, 0);
arc(monsterTwoAnchorPointX+42, monsterTwoAnchorPointY+58, 30, 45, -PI, -HALF_PI);
//body
fill(0);
ellipse(monsterTwoAnchorPointX+45, monsterTwoAnchorPointY+25, 90, 50);
//large middle eye
fill(255);
arc(monsterTwoAnchorPointX+45, monsterTwoAnchorPointY+20, 25, 15, -PI, 0);
arc(monsterTwoAnchorPointX+45, monsterTwoAnchorPointY+20, 25, 15, 0, PI);
//iris
fill(0);
ellipse(monsterTwoAnchorPointX+45, monsterTwoAnchorPointY+20, 5, 15);
//left side eye 1
fill(255);
arc(monsterTwoAnchorPointX+23, monsterTwoAnchorPointY+21, 7, 5, -PI, 0);
arc(monsterTwoAnchorPointX+23, monsterTwoAnchorPointY+21, 7, 5, 0, PI);
//iris
fill(0);
ellipse(monsterTwoAnchorPointX+23, monsterTwoAnchorPointY+21, 2, 5);
//left side eye 2
fill(255);
arc(monsterTwoAnchorPointX+11, monsterTwoAnchorPointY+22, 7, 5, -PI, 0);
arc(monsterTwoAnchorPointX+11, monsterTwoAnchorPointY+22, 7, 5, 0, PI);
//iris
fill(0);
ellipse(monsterTwoAnchorPointX+11, monsterTwoAnchorPointY+22, 2, 5);
//right side eye 1
fill(255);
arc(monsterTwoAnchorPointX+68, monsterTwoAnchorPointY+21, 7, 5, -PI, 0);
arc(monsterTwoAnchorPointX+68, monsterTwoAnchorPointY+21, 7, 5, 0, PI);
//iris
fill(0);
ellipse(monsterTwoAnchorPointX+68, monsterTwoAnchorPointY+21, 2, 5);
//right side eye 2
fill(255);
arc(monsterTwoAnchorPointX+80, monsterTwoAnchorPointY+22, 7, 5, -PI, 0);
arc(monsterTwoAnchorPointX+80, monsterTwoAnchorPointY+22, 7, 5, 0, PI);
//iris
fill(0);
ellipse(monsterTwoAnchorPointX+80, monsterTwoAnchorPointY+22, 2, 5);
}
//monster two's movement is that everytime it hits the wall, it will make a 45 degree angle the other direction
void monsterTwoMove() {
monsterTwoAnchorPointX = monsterTwoAnchorPointX + (monsterTwoSpeed * monsterDirectionX);
monsterTwoAnchorPointY = monsterTwoAnchorPointY + (monsterTwoSpeed * monsterDirectionY);
//when monster hits the sides wall, it needs to change direction by multiplying it by -1
if (monsterTwoAnchorPointX > width - 90|| monsterTwoAnchorPointX < 0) {
monsterDirectionX = monsterDirectionX * -1;
}
//when monster hits the top and bottom wall, it needs to change direction
if (monsterTwoAnchorPointY > height - 60|| monsterTwoAnchorPointY < 0) {
monsterDirectionY = monsterDirectionY * -1;
}
//the speed increases overtime
monsterTwoSpeed=monsterTwoSpeed+0.001;
}
//////////////////////////////////////////////
//////// MOVEMENT AND CONSTRAINS /////////
//////////////////////////////////////////////
//the game over screen
void gameOverScreen () {
//when the shading increases to 400 or more
if (shading >= 400) {
gameOver = true;
}
}
//the wall and boundary of the game
void wallConstraint() {
//when the player hits the side of the walls
if (playerAnchorPointX - playerSizeX/2 <= 0) {
//it will continue to hit the side of the wall and can no longer go left
playerAnchorPointX = 0 + playerSizeX/2;
goLeft = false;
//if it hits the other side of the wall
} else if (playerAnchorPointX + playerSizeX/2 >= width) {
//will continue to hit that wall again and no longer allowed to go right
playerAnchorPointX = width - playerSizeX/2;
goRight = false;
}
//basically the same as above, but written for up and down
if (playerAnchorPointY - playerSizeY <= 12) {
playerAnchorPointY = 12 + playerSizeY;
goUp = false;
} else if (playerAnchorPointY + playerSizeY/2 >= height) {
playerAnchorPointY = height - playerSizeY/2;
goDown = false;
}
}
//the players movement
void playerMove() {
if (goUp == true) {
//when up is pushed, the player will go +2 in pixels in any direction, along with adding 2 steps in player
playerAnchorPointY -= 2;
playerStep += 2;
}
if (goLeft == true) {
playerAnchorPointX -= 2;
playerStep += 2;
}
if (goDown == true) {
playerAnchorPointY += 2;
playerStep += 2;
}
if (goRight == true) {
playerAnchorPointX += 2;
playerStep += 2;
}
}
//setting up the WASD so it will respond
//included a capital version so that if someone accidentally CapLocks, it will still play
void keyPressed() {
if (key == 'w' || key == 'W') {
goUp=true;
legMove = true;
}
if (key == 'a' || key == 'A') {
goLeft=true;
legMove = true;
}
if (key == 's'|| key == 'S') {
goDown=true;
legMove = true;
}
if (key == 'd'|| key == 'D') {
goRight=true;
legMove = true;
}
//if 'k' or 'K' if pressed AND if it is game over, it will run setup again
if ((key == 'k'|| key == 'K') && gameOver == true) {
setup();
}
}
//if WASD is released, player will stop
void keyReleased() {
if (key == 'w' || key == 'W') {
goUp=false;
legMove = false;
}
if (key == 'a' || key == 'A') {
goLeft=false;
legMove = false;
}
if (key == 's' || key == 'S') {
goLeft=false;
goDown=false;
}
if (key == 'd' || key == 'D') {
goLeft=false;
goRight=false;
}
}