//obstacle variables float ballX1 = 0; float ballX2 = 400; float ballY1 = 125; float ballY2 = -275; float ballW = 50; float ballH = 50; float ballSpeed = 5; float movementY = 3; //cannon variables float quadX = 0; float quadY = 50; float quadY2 = -350; float rectX = 0; float rectY = 125; float rectY2 = -275; //background paths float pathX = 0; float pathY = 0; float pathFinish = -800; //player variables float shipX = 200; float shipY = 380; float shipSpeedY = -3; float flameX = 196.5; float flameY = 390; float flameTip = 398; float lazerX = 200; float lazerY = 380; float lazerSpeedY = -10; float lazerSpeedX1 = 0.5; float lazerSpeedX2 = 0.5; //player movement variables float thrust = 0.5; float acceleration = 0.1; float speed1 = 0.5; float speed2 = 0.5; //enemy variables float enemyX = 200; float enemyY = -600; float enemySpeedY = 3; float enemyFlameX = 196; float enemyFlameY = -610; float enemyTip = -630; float enemyThrust = 1.5; float enemyLazX = enemyX - 15; float enemyLazY = -600; float enemyLazSpeedY = 10; float enemyLazSpeedX = 1.5; //scoring variables int count = 0; int enemyDeaths = 0; //switches boolean start = false; boolean trigger = false; boolean shoot = false; boolean boost = false; boolean enemyShoot = false; boolean enemyDead = false; boolean victory = false; void setup() { size(400, 400); ellipseMode(CENTER); rectMode(CENTER); println("Click to start!"); } void draw() { background(0); //star placement drawStars(60, 20); drawStars(140, 40); drawStars(40, 90); drawStars(200, 140); drawStars(60, 190); drawStars(250, 230); drawStars(160, 260); drawStars(300, 290); drawStars(230, 340); drawStars(320, 360); drawStars(150, 380); drawStars(230, 30); drawStars(30, 350); drawStars(75, 280); drawStars(300, 60); drawStars(320, 170); drawStars(360, 240); drawStars(380, 100); drawStars(360, 40); //path structure fill(80); stroke(0); rect(pathX + 200, pathY - 400, 150, 100); rect(pathX + 200, pathY - 300, 150, 100); rect(pathX + 200, pathY - 200, 150, 100); rect(pathX + 200, pathY - 100, 150, 100); rect(pathX + 200, pathY, 150, 100); rect(pathX + 200, pathY + 100, 150, 100); rect(pathX + 200, pathY + 200, 150, 100); rect(pathX + 200, pathY + 300, 150, 100); rect(pathX + 200, pathY + 400, 150, 100); //draw all objects drawFinish(pathX + 200,pathFinish,150); drawShip(); drawEnemy(); drawLeftCannon(); drawRightCannon(); //cannons continuosly fire if (ballX1 >= 450) { ballX1=ballX1-460; } if (ballX2 <= -50) { ballX2=ballX2+460; } //player resets when hit by left cannon if ((shipX <= ballX1 + 25 && shipX >= ballX1 - 25) && (shipY - 20 <= ballY1 + 25 && shipY - 20 >= ballY1 - 25)) { start = false; flameY = 390; flameTip = 398; } //player resets when hit by right cannon if ((shipX <= ballX2 + 25 && shipX >= ballX2 - 25) && (shipY - 20 <= ballY2 + 25 && shipY - 20 >= ballY2 -25)) { start = false; flameY = 390; flameTip = 398; } //player resets when hit by enemy fire if ((enemyLazX >= shipX - 60 && enemyLazX <= shipX + 40) && (enemyLazY >= shipY -10 && enemyLazY <= shipY + 5)){ start = false; flameY = 390; flameTip = 398; } //loop path while (pathY >= 400 && start == true) { pathY = pathY - 400 ; } //when game starts if (start == true) { //ship flies up runShip(); //ship remains at y = 300 if (shipY <= 300 && victory == false) { shipY = 300; shipSpeedY = 0; flameY = 290; flameTip = shipY + 40; //ship flies off after crossing finish line and game is over } else if (victory == true){ shipY = shipY + shipSpeedY; flameY = shipY + 10; flameY = flameY + shipSpeedY; flameTip = shipY + 40; shipSpeedY = -3; lazerY = -100; //game says victory println("Victory!"); //game resets by clicking after game is over if (mousePressed && shipY < 0){ start = false; flameY = 390; flameTip = 398; } } //movement illusion while ship stays in place if (shipY == 300){ //cannons move quadY = quadY + movementY; ballY1 = ballY1 + movementY; rectY = rectY + movementY; quadY2 = quadY2 + movementY; ballY2 = ballY2 + movementY; rectY2 = rectY2 + movementY; //path moves pathY = pathY + movementY; //loop cannons after going off screen if (quadY >= 800 && enemyDeaths <= 2) { drawLeftCannon(); rectY = rectY - 1000; quadY = quadY - 1000; ballY1 = ballY1 - 1000; } if (quadY2 >= 800 && enemyDeaths <= 2) { drawRightCannon(); rectY2 = rectY2 - 1000; quadY2 = quadY2 - 1000; ballY2 = ballY2 - 1000; } } } else { //game restart resetGame(); start = false; } //reset other statements at game restart if (start == false) { trigger = false; shoot = false; enemyShoot = false; //say click to start println("Click to start!"); //scores start at zero count = 0; enemyDeaths = 0; } //keep track of how many balls avoided if (((ballY1 >= 300 && ballY1 <= 302) || (ballY2 >= 300 && ballY2 <= 302)) && start == true && movementY == 3 && boost == false) { count = count + 1; println("Blasts Avoided " + count); //different number range when boosting } else if ((boost == true && ballY1 >= 300 && ballY1 <= 305) || (boost == true && ballY2 >= 300 && ballY2 <= 305)){ count = count + 1; println("Blasts Avoided " + count); } //ball speed increases if (count >= 3 && count <=6){ ballSpeed = 8; } //enemy appears if (ballSpeed == 8 && count >= 6){ runEnemy(); } //enemy re-appears faster if (enemyDeaths == 1){ enemyX = enemyX + enemyThrust; enemyFlameX = enemyFlameX + enemyThrust; enemyLazX = enemyLazX + enemyLazSpeedX; } //enemy re-appears even faster if (enemyDeaths >= 2){ enemyX = enemyX + enemyThrust * 2; enemyFlameX = enemyFlameX + enemyThrust * 2; enemyLazX = enemyLazX + enemyLazSpeedX * 2; } //finish line approaches if (enemyDeaths == 3){ enemyY = -200; enemyLazY = -200; enemyFlameY = -200; enemyTip = -210; pathFinish = pathFinish + movementY; } //game is over and everything stops moving if (pathFinish >= 200){ victory = true; pathY = 200; pathFinish = 200; } } //draw player ship void drawShip() { fill(255, 0, 0); triangle(flameX - 7, flameY, flameX, flameY, flameX - 3, flameTip); triangle(flameX + 7, flameY, flameX + 14, flameY, flameX + 11, flameTip); //flame animation if (start == false){ flameTip = flameTip + thrust; if (flameTip>=flameY + 10 || flameTip<=flameY + 6) { thrust=thrust *-1; } } //lazer beams noStroke(); fill(150, 250, 0); rect(lazerX - 13, lazerY - 10, 3, 6); rect(lazerX + 14, lazerY - 10, 3, 6); //ship structure stroke(0); fill(200); rect(shipX-13, shipY-10, 5, 12); rect(shipX+14, shipY-10, 5, 12); fill(200); rect(shipX-7, shipY+10, 7, 10); rect(shipX+8, shipY+10, 7, 10); fill(0, 0, 200); quad(shipX-30, shipY+10, shipX-10, shipY-10, shipX+10, shipY-10, shipX+30, shipY+10); triangle(shipX-10, shipY, shipX, shipY-30, shipX+10, shipY); rect(shipX, shipY, 20, 20); noStroke(); fill(0); triangle(shipX - 5, shipY - 10, shipX, shipY - 20, shipX + 5, shipY -10); ellipse(shipX, shipY-8, 10, 10); } //activate ship movement and controls void runShip() { shipY = shipY + shipSpeedY; lazerY = lazerY + shipSpeedY; shipSpeedY = shipSpeedY - acceleration; flameY = flameY + shipSpeedY; flameTip = shipY + 40; //boost if (keyPressed) { boost = true; //increase speed movementY = 6; //speed lines for effect stroke(200); line(shipX - 30, shipY + 10, shipX - 30, shipY + 30); line(shipX + 30, shipY + 10, shipX + 30, shipY + 30); //show boost flames drawBoost(); } else { movementY = 3; boost = false; } //control ship left if (mouseX <= shipX) { shipX = shipX - speed1; flameX = flameX - speed1; lazerX = lazerX - lazerSpeedX1; lazerSpeedX1 = lazerSpeedX1 + acceleration; lazerSpeedX2 = 0; speed1 = speed1 + acceleration; speed2 = 0; } else { //control ship right shipX = shipX + speed2; flameX = flameX + speed2; lazerX = lazerX + lazerSpeedX2; lazerSpeedX2 = lazerSpeedX2 + acceleration; lazerSpeedX1 = 0; speed2 = speed2 + acceleration; speed1 = 0; } //trigger activates lazer if (shipY <= 300) { trigger = true; } else { trigger = false; } //mouse click shoots if (trigger == true && mousePressed) { shoot = true; } //lazer shoots straight if (shoot == true) { lazerY = lazerY - 10; lazerSpeedX1 = 0; lazerSpeedX2 = 0; } //lazer returns to position related to ship if (lazerY <= -20) { shoot = false; lazerY = 300; } //lazer continues to move with ship if (shoot == false) { lazerX = shipX + acceleration; lazerSpeedX1 = 0.5; lazerSpeedX1 = lazerSpeedX1 + acceleration; lazerSpeedX2 = 0.5; lazerSpeedX2 = lazerSpeedX2 + acceleration; } } //boost flames void drawBoost() { noStroke(); fill(0, 0, 255); ellipse(shipX - 7, shipY + 32, 6, 30); ellipse(shipX + 7, shipY + 32, 6, 30); fill(255); ellipse(shipX - 7, shipY + 32, 2, 35); ellipse(shipX + 7, shipY + 32, 2, 35); } //left cannon structure with shoot speed = 5 void drawLeftCannon() { //outer ball fill(150, 255, 150); noStroke(); ellipse(ballX1, ballY1, ballW, ballH); //inner ball fill((int) random(0,256),(int) random(0,256),(int) random(0,256)); ellipse(ballX1, ballY1, ballW - 15, ballH - 15); ballX1=ballX1+ballSpeed; //tube stroke(0); fill(100); rect(rectX, rectY, 120, 80); //base fill(150,0,0); quad(quadX, quadY, quadX + 50, quadY + 25, quadX + 50, quadY + 125, quadX, quadY + 150); } //right cannon structure with shoot speed faster than left cannon void drawRightCannon() { //outer ball fill(255, 150, 150); noStroke(); ellipse(ballX2, ballY2, ballW, ballH); //inner ball fill((int) random(0,256),(int) random(0,256),(int) random(0,256)); ellipse(ballX2, ballY2, ballW - 15, ballH - 15); ballX2=ballX2-ballSpeed * 1.2; //tube stroke(0); fill(100); rect(rectX + 400, rectY2, 120, 80); //base fill(150,0,0); quad(quadX + 400, quadY2, quadX + 350, quadY2 + 25, quadX + 350, quadY2 + 125, quadX + 400, quadY2 +150); } //draw stars in background void drawStars(float starX, float starY) { //random colours changing fill((int) random(0,256),(int) random(0,256),(int) random(0,256)); noStroke(); ellipse(starX, starY, 5, 5); } //enemy ship void drawEnemy() { //flames fill(230, 100, 0); triangle(enemyFlameX, enemyFlameY, enemyX, enemyTip, enemyX + 4, enemyFlameY); //enemy lazers fill(0,255,0); noStroke(); rect(enemyLazX,enemyLazY,3,10); rect(enemyLazX + 30,enemyLazY,3,10); //structure stroke(0); fill(150, 0, 0); rect(enemyX - 15, enemyY + 5, 10, 20); rect(enemyX + 15, enemyY + 5, 10, 20); rect(enemyX, enemyY - 5, 10, 20); ellipse(enemyX, enemyY, 60, 20); fill(50); ellipse(enemyX, enemyY + 4, 20, 10); fill(0, 200, 0); ellipse(enemyX - 20, enemyY, 5, 5); ellipse(enemyX + 20, enemyY, 5, 5); } //enemy movement void runEnemy(){ //enemy flies down enemyY = enemyY + enemySpeedY; enemyFlameY = enemyFlameY + enemySpeedY; enemyTip = enemyY - 50; enemyLazY = enemyLazY + enemySpeedY; //keep enemy on screen if (enemyY >= 100) { enemySpeedY = 0; } //all enemy parts move together at y = 100 and enemy shoots continuously if (enemySpeedY <= 0) { enemyX = enemyX + enemyThrust; enemyFlameX = enemyFlameX + enemyThrust; enemyTip = 60; enemyLazX = enemyLazX + enemyLazSpeedX; enemyShoot = true; } else { enemyShoot = false; } //enemy moves left and right if (enemyX >= 370 || enemyX <= 30) { enemyThrust = enemyThrust * -1; enemyLazSpeedX = enemyLazSpeedX * -1; } //enemy shoots every time enemyLazY >= 650 if (enemyShoot == true && enemyLazY <= 650 && start == true){ enemyLazY = enemyLazY + enemyLazSpeedY; } else if (enemyLazY >= 650) { enemyLazY = 100; } //enemy shot goes straight if (enemyLazY > 100 && enemyLazY < 650 && enemyShoot == true){ enemyLazSpeedX = 0; //lazer moves with enemy after every shot } else { enemyLazSpeedX = 1.5; enemyLazX = enemyX - 15; } //destroy enemy if ((lazerX >= enemyX - 40 && lazerX <= enemyX + 40) && (lazerY >= enemyY - 20 && lazerY <= enemyY)){ enemyDead = true; } else if (enemyDead == true) { //reset enemy off screen enemyX = 200; enemyY = -600; enemySpeedY = 3; enemyFlameX = 196; enemyFlameY = -610; enemyTip = -600; enemyThrust = 1.5; enemyLazX = enemyX - 15; enemyLazY = -600; enemyLazSpeedY = 10; enemyLazSpeedX = 1.5; enemyDeaths = enemyDeaths + 1; enemyDead = false; } } //reset coordinates and statements void resetGame(){ start = false; victory = false; shipY = 380; shipX = 200; shipSpeedY = 0; flameX = 196.5; flameY = 390; lazerX = 200; lazerY = 380; rectY = 125; quadY = 50; ballY1 = 125; rectY2 = -275; quadY2 = -350; ballY2 = -275; ballSpeed = 5; enemyX = 200; enemyY = -200; enemySpeedY = 3; enemyFlameX = 196; enemyFlameY = -210; enemyTip = -230; enemyThrust = 1.5; enemyLazY = -200; enemyLazX = enemyX - 15; pathFinish = -800; enemyDeaths = 0; count = 0; } //finish line void drawFinish(float x, float y, float w){ //white strip fill(255); rect(x,y,w,w/2); //checkers fill(0); rect(x - w/2.4,y - w/8, w/6, w/4); rect(x - w/4,y + w/8, w/6, w/4); rect(x - w/12,y - w/8, w/6, w/4); rect(x + w/12,y + w/8, w/6, w/4); rect(x + w/4,y - w/8, w/6, w/4); rect(x + w/2.4,y + w/8, w/6, w/4); } //clicking mouse starts game void mousePressed() { start = true; }