/*
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
}