Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/*

Controls: WASD
Author: Nathan Faber-Good
Date: Oct 3, 2017
Description: U R in heck. Survive.

*/

float pixlsX = 0;
float pixlYPos;
float charPos = 200;   
float lastCharPos;
float enemyYPos;
float enemyXLPos;
float enemyXRPos;
float enemyTopMove;
float enemyLMove;
float enemyRMove;
float enemyTopSpeed = 1;
float enemyRSpeed = 1;
float enemyLSpeed = 1;
float enemySpeed = 1;
float textPos = 200; 
float playTime;
float flameHeight = 0;
boolean playerAlive = true;

void setup() {
  size(400, 400);
  noStroke();
}

void draw() {
  //Show time in console while player is alive
  if (playerAlive == true) {
    playTime = millis()/600;
    println("Time:");
    println(playTime);
  }
  //Enemy Movement
  enemyRMove+=1;
  enemyLMove+=1;
  enemyTopMove+=1;

  //Conditions for enemy hit detections
  boolean doSwordUp = false;
  boolean doSwordRight = false;
  boolean doSwordLeft = false;

  // Fading background
  fill(0, 0, 60, 50);
  rect(0, 0, width, height);

  //Draw Flames
  fill(239, 0, 31);
  drawFlames(0, 30);

  //Instance Enemies
  fill(255);
  enemyTop(180, -200, 1);
  enemyLeft(-290, 260, 1);
  enemyRight(660, 260, -1);

  //Player Control
  fill(0, 255, 100);
  if (keyPressed) {
    if (key == 'd') {
      swordRight();
      doSwordRight = true;
    } else if (key == 'a') {
      swordLeft(); 
      doSwordLeft = true;
    } else if (key == 'w') {
      swordUp();
      doSwordUp = true;
    } else {
      sword();
    }
  } else {
    sword();
  } 

  //Enemy hit detection
  if (doSwordUp==true && enemyYPos >= 140 && enemyYPos <= 260) {
    enemyTopMove=0;
    enemyTopSpeed +=random(0.1, 0.5);
  } else if (doSwordLeft == true && enemyXLPos >= 90 && enemyXLPos <= 200) {
    enemyLMove=0;
    enemyLSpeed +=random(0.1, 0.5);
  } else if (doSwordRight == true && enemyXRPos <= 310 && enemyXRPos >= 200) {
    enemyRMove=0;
    enemyRSpeed += random(0.1, 0.5);
  } 

  //Character hit by enemy detection
  if (enemyYPos >=250 || enemyXLPos >= 200 || enemyXRPos <= 200 ) {
    death();
    playerAlive = false;
  }
}

//Death Function
void death() {
  println("Score:");
  println(playTime);
  charPos = 500;
  fill(0, 0, 60);
  rect(0, 0, width, height);
  fill(239, 0, 31);
  if(flameHeight <= 400){
  flameHeight+=1;
  }
  drawFlames(0, 30);
  fill(0, 255, 100);
  deathText();
}

void deathText(){
  drawXYPixls(textPos-75,textPos-55,180,185);//D top
  drawXYPixls(textPos-75,textPos-65,190,225);//D Lside
  drawXYPixls(textPos-75,textPos-55,220,225);//D Bottom
  drawXYPixls(textPos-55,textPos-45,190,215);//D Rside
  drawXYPixls(textPos-35,textPos-5,180,185);//E Top
  drawXYPixls(textPos-35,textPos-25,190,215);//E side
  drawXYPixls(textPos-35,textPos-5,220,225);//E Bottom
  drawXYPixls(textPos-35,textPos-15,200,205);//E Middle
  drawXYPixls(textPos+15,textPos+25,180,185);//A Top
  drawXYPixls(textPos+5,textPos+15,190,220);//A Lside
  drawXYPixls(textPos+25,textPos+35,190,220);//A Rside
  drawXYPixls(textPos+5,textPos+35,200,205);//A Middle
  drawXYPixls(textPos+45,textPos+65,180,185);//D2 top
  drawXYPixls(textPos+45,textPos+55,190,225);//D2 Lside
  drawXYPixls(textPos+45,textPos+65,220,225);//D2 Bottom
  drawXYPixls(textPos+65,textPos+75,190,215);//D2 Rside
}

//Draw Flames
void drawFlames(float startPos, float xDist ) {
  float flameTopPos;
  while (startPos >= -1 && startPos <= 400) {
    noStroke();
    flameTopPos = random(350-flameHeight, 390-flameHeight);
    drawXYPixls(startPos, startPos+=xDist, flameTopPos, 400);
  }
}

//Function draws a line of rectangles(pixels) from one x position to another at a given y position.
void drawXPixls(float startXPos, float endXPos, float pixlY) {
  for (float pixlX = startXPos; pixlX >= startXPos && pixlX < endXPos; pixlX += 10 ) {
    rect(pixlX, pixlY, 10, 5);
  }
}

//Takes the previous function, and vertically repeats it a given number of times.
void drawXYPixls(float startXPos, float endXPos, float pixlYPosSet, float pixlYDist) {
  for (pixlYPos = pixlYPosSet; pixlYPos <= pixlYDist; pixlYPos+=10 ) {
    drawXPixls(startXPos, endXPos, pixlYPos);
  }
}

//Draws sword/character in neutral position
void sword() {
  drawXYPixls(charPos-5, charPos, 190, 200);//tip
  drawXYPixls(charPos-10, charPos+10, 200, 260);//blade
  drawXYPixls(charPos-5, charPos, 260, 280);//handle
  drawXYPixls(charPos+20, charPos+40, 270, 270);//top/head
  drawXYPixls(charPos, charPos+20, 280, 280);//Lside
  drawXYPixls(charPos+40, charPos+50, 280, 280);//Rside
  drawXYPixls(charPos+10, charPos+50, 290, 300);//body
}

//Draws sword/character in right attack position
void swordRight() {
  drawXYPixls(charPos+10, charPos+90, 280, 290);//bladee
  drawXYPixls(charPos+90, charPos+100, 285, 290);//tip
  drawXYPixls(charPos, charPos+10, 285, 290);//handle
  drawXYPixls(charPos-50, charPos, 290, 300);//body
  drawXYPixls(charPos-50, charPos-20, 280, 290);//side
  drawXYPixls(charPos-40, charPos, 270, 275);//top
}

//Draws sword/character in left attack position
void swordLeft() {
  drawXYPixls(charPos-90, charPos-10, 280, 290);//bladee
  drawXYPixls(charPos-100, charPos-90, 285, 290);//tip
  drawXYPixls(charPos-10, charPos, 285, 290);//handle
  drawXYPixls(charPos+20, charPos+50, 280, 290);//side
  drawXYPixls(charPos, charPos+40, 270, 275);//topaaad
  drawXYPixls(charPos, charPos+50, 290, 300);//body
}

//Draws sword/character in upwards attack position
void swordUp() {
  drawXYPixls(charPos-5, charPos, 160, 170);//tip
  drawXYPixls(charPos-10, charPos+10, 170, 230);//blade
  drawXYPixls(charPos-5, charPos, 230, 250);//handle
  drawXYPixls(charPos-10, charPos+10, 260, 265);//top
  drawXYPixls(charPos+10, charPos+20, 240, 290);//Rside
  drawXYPixls(charPos-20, charPos-10, 240, 290);//Lside
  drawXYPixls(charPos-20, charPos+20, 280, 300);//body
}

//Draws an enemy that falls from the top
void enemyTop(float xPos, float yPos, float vertMoveControl) {
  enemyYPos = enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+40;//Variable for hit detection check
  drawXYPixls(xPos-5, xPos+45, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+10);//Top
  drawXYPixls(xPos-10, xPos+50, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+10, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+15);//MidTop
  drawXYPixls(xPos-10, xPos, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+20, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+25);//Lside
  drawXYPixls(xPos+40, xPos+50, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+20, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+25);//Rside
  drawXYPixls(xPos+15, xPos+20, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+20, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+25);//Mid
  drawXYPixls(xPos-5, xPos+10, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+30, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+35);//LMidBottom
  drawXYPixls(xPos+25, xPos+40, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+30, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+35);//RMidBottom
  drawXYPixls(xPos+10, xPos+25, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+40, enemyTopMove*enemyTopSpeed*vertMoveControl+yPos+50);//Bottom
}

//Draws an enemy that come from the right
void enemyRight(float xPos, float yPos, float horizMoveControl) {
  enemyXRPos = enemyRMove*enemyRSpeed*horizMoveControl+xPos;//Variable for hit detection check
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos-5, enemyRMove*enemyRSpeed*horizMoveControl+xPos+45, yPos, yPos+10);//Top
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos-10, enemyRMove*enemyRSpeed*horizMoveControl+xPos+50, yPos+10, yPos+15);//MidTop
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos-10, enemyRMove*enemyRSpeed*horizMoveControl+xPos, yPos+20, yPos+25);//Lside
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos+40, enemyRMove*enemyRSpeed*horizMoveControl+xPos+50, yPos+20, yPos+25);//Rside
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos+15, enemyRMove*enemyRSpeed*horizMoveControl+xPos+20, yPos+20, yPos+25);//Mid
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos-5, enemyRMove*enemyRSpeed*horizMoveControl+xPos+10, yPos+30, yPos+35);//LMidBottom
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos+25, enemyRMove*enemyRSpeed*horizMoveControl+xPos+40, yPos+30, yPos+35);//RMidBottom
  drawXYPixls(enemyRMove*enemyRSpeed*horizMoveControl+xPos+10, enemyRMove*enemyRSpeed*horizMoveControl+xPos+25, yPos+40, yPos+50);//Bottom
}

//Draws an enemy that comes from the left
void enemyLeft(float xPos, float yPos, float horizMoveControl) {
  enemyXLPos = enemyLMove*enemyLSpeed*horizMoveControl+xPos+40;//Variable for hit detection check
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos-5, enemyLMove*enemyLSpeed*horizMoveControl+xPos+45, yPos, yPos+10);//Top
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos-10, enemyLMove*enemyLSpeed*horizMoveControl+xPos+50, yPos+10, yPos+15);//MidTop
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos-10, enemyLMove*enemyLSpeed*horizMoveControl+xPos, yPos+20, yPos+25);//Lside
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos+40, enemyLMove*enemyLSpeed*horizMoveControl+xPos+50, yPos+20, yPos+25);//Rside
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos+15, enemyLMove*enemyLSpeed*horizMoveControl+xPos+20, yPos+20, yPos+25);//Mid
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos-5, enemyLMove*enemyLSpeed*horizMoveControl+xPos+10, yPos+30, yPos+35);//LMidBottom
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos+25, enemyLMove*enemyLSpeed*horizMoveControl+xPos+40, yPos+30, yPos+35);//RMidBottom
  drawXYPixls(enemyLMove*enemyLSpeed*horizMoveControl+xPos+10, enemyLMove*enemyLSpeed*horizMoveControl+xPos+25, yPos+40, yPos+50);//Bottom
}