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