/*
INTERACTIVE TOY ASSIGNMENT
Project Name: Galactic Blaster
By: Ashborn Binapal
While travelling through space you are told about red oncoming asteroids.
Your mission: Destroy the oncoming red asteroids before its too late (its never too late) and
increase your score to reach the Galactic Crusader title.
//////////////////////CONTROLS/////////////////////////
Ship Movement = W,A,S,D
Fire = P
Display Score = Spacebar
*/
//Ship Variables
int shipX=300;
int shipY=300;
int speed=4;
int gem1=196;
int gem2=26;
int gem3=26;
int noseColour=77;
//Score Variable
int score;
//Sneaky Banana Variable
int bananaX=45;
boolean bananaBlessed=false;
//Laser Variables
float laserX=shipX;
float laserY=shipY;
int laserspeed=15;
//Boundary Variables
int boundaryX1=0;
int boundaryX2=400;
int boundaryY1=0;
int boundaryY2=400;
//Asteroid Variables
float asteroidX=200;
float asteroidY=boundaryY1-100;
float asteroidSpeed=3.5;
boolean destroyed=false;
//Switch Variables
boolean goRight=false;
boolean goLeft=false;
boolean goDown=false;
boolean goUp=false;
boolean laserOn=false;
void setup() {
size (400, 400);
background(0);
rectMode(CENTER);
}
void draw() {
drawBackground();
//Resets rectMode to CENTER after draw background
rectMode(CENTER);
noStroke();
//Function Callbacks
moveChar();
moveLaser();
drawPlanets();
drawBanana();
drawStars();
drawLaser();
drawFlame();
drawShuttle();
drawAsteroid();
updateAsteroid();
moveAsteroid();
scoreAchievements();
}
void drawShuttle() {
//SHIP NOSE
fill(noseColour, noseColour, noseColour);
rect(shipX, shipY-30, 8, 20);
rect(shipX, shipY-40, 5, 20);
rect(shipX, shipY-50, 3, 20);
//GUNS
fill(noseColour, noseColour, noseColour);
//Gun (Left)
rect(shipX-30, shipY+2, 4, 7);
rect(shipX-30, shipY, 2, 9);
//Gun (Right)
rect(shipX+30, shipY+2, 4, 7);
rect(shipX+30, shipY, 2, 9);
//WINGS
//Wing (Left)
fill(35, 45, 178);
triangle(shipX, shipY+10, shipX, shipY-35, shipX-50, shipY+30);
//Wing (Right)
triangle(shipX, shipY+10, shipX, shipY-35, shipX+50, shipY+30);
//THRUSTER
fill(178, 158, 80);
rect(shipX, shipY+15, 15, 10);
//BODY
fill(255, 235, 159);
rect(shipX, shipY, 20, 20);
triangle(shipX+10, shipY-10, shipX+20, shipY+20, shipX, shipY+10);
triangle(shipX-10, shipY-10, shipX-20, shipY+20, shipX, shipY+10);
triangle(shipX+10, shipY-10, shipX+15, shipY-5, shipX, shipY+10);
triangle(shipX-10, shipY-10, shipX-15, shipY-5, shipX, shipY+10);
//WINDOW
fill(177, 182, 255);
ellipse(shipX, shipY-15, 18, 40);
fill(255);
ellipse(shipX+5, shipY-20, 4, 8);
ellipse(shipX+5, shipY-10, 2, 4);
//GEM
fill(gem1, gem2, gem3);
ellipse(shipX, shipY+10, 5, 10);
}
//FLAME
void drawFlame() {
fill(255, 0, 0, 150);
ellipse(shipX, shipY+22, random(7, 14), random(24, 38));
fill(250, 158, 38, 150);
ellipse(shipX, shipY+22, random(5, 10), random(16, 32));
fill(254, 255, 41, 150);
ellipse(shipX, shipY+22, 6, random(8, 16));
}
//STARS
void drawStars() {
fill(245, 245, 245, 200);
rect(35, (frameCount % 80)*10, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(50, (frameCount % 200)*2, sin(frameCount/2), 2+sin(frameCount/2));
rect(80, (frameCount % 120)*4, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(150, (frameCount % 95)*6, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(260, (frameCount % 64)*8, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(180, (frameCount % 77)*7, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(320, (frameCount % 116)*12, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(350, (frameCount % 200)*2.5, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(225, (frameCount % 154)*3, 2+sin(frameCount/2), 2+sin(frameCount/2));
rect(145, (frameCount % 99)*5, 2+sin(frameCount/2), 2+sin(frameCount/2));
}
//PLANETS
void drawPlanets() {
//Medium Planet (purple)
fill(173, 25, 193, 80);
ellipse(100, -20+(frameCount % 280)*4, 20, 20);
//Large Planet (green)
fill(133, 234, 162, 80);
ellipse(245, -40+(frameCount % 180)*3, 40, 40);
//Tiny Planet (light orange)
fill(234, 199, 80, 100);
ellipse(375, -10+(frameCount % 235)*6, 10, 10);
}
//BANANA (Special Cameo for one of my friends)
void drawBanana() {
//Banana Body
fill(247, 255, 36);
ellipse(bananaX, -30+(frameCount % 750)*2, 30, 30);
//Sphere that blends with background
fill(8, 8, 8);
ellipse(35, -30+(frameCount % 750)*2, 30, 30);
//Banana Ends
fill(50, 50, 50);
ellipse(40, -45+(frameCount % 750)*2, 5, 5);
ellipse(40, -15+(frameCount % 750)*2, 5, 5);
}
//ASTEROID
void drawAsteroid() {
//Draws Asteroid if destroyed value is false
if (destroyed == false) {
fill(100, 100, 100);
ellipse(asteroidX, asteroidY, 50, 50);
fill(162, 162, 162);
ellipse(asteroidX-5, asteroidY-8, 15, 12);
ellipse(asteroidX+10, asteroidY+5, 8, 10);
ellipse(asteroidX-15, asteroidY+10, 8, 8);
fill(237, 33, 27, 100);
ellipse(asteroidX, asteroidY, 60, 60);
}
}
//UPDATE ASTEROID
void updateAsteroid() {
//Resets Asteroid and changes X position if laser values enter its hit box
if (laserX < asteroidX+25 && laserX > asteroidX-25 && laserY < asteroidY+25 && laserY > asteroidY-25) {
destroyed = true;
asteroidX = random(100, 380);
asteroidY = boundaryY1-100;
score = score + 1;
asteroidSpeed = random(4, 8);
println ("KA-BOOM");
destroyed = false;
}
//Resets Asteroid and changes X position if it hits the bottom of the screen
if (asteroidY >= boundaryY2+25) {
destroyed = true;
asteroidY = boundaryY1 - 100;
asteroidX = random(80, 380);
asteroidSpeed = random(4, 8);
destroyed = false;
}
}
//MOVE ASTEROID
void moveAsteroid() {
//Constantly changes asteroidY to make it move
asteroidY = asteroidY + asteroidSpeed;
}
//SWITCHES
//These are what change the boolean value to true to allow movement
void keyPressed() {
if (key == 'd') {
goRight = true;
}
if (key == 'a') {
goLeft = true;
}
if (key == 's') {
goDown = true;
}
if (key == 'w') {
goUp = true;
}
if (key == 'p') {
laserOn = true;
}
if (key == ' ') {
print ("SCORE: ");
println ( score);
}
}
//SWITCHES OFF
//These are what change the boolean value to false to stop movement on release
void keyReleased() {
if (key == 'd') {
goRight = false;
}
if (key == 'a') {
goLeft = false;
}
if (key == 's') {
goDown = false;
}
if (key == 'w') {
goUp = false;
}
}
//This function controls the ship's movement
void moveChar() {
if (shipX < boundaryX2) {
if (goRight == true) {
shipX= shipX+speed;
laserX= laserX+speed;
}
}
if (shipX > boundaryX1) {
if (goLeft == true) {
shipX= shipX-speed;
laserX= laserX-speed;
}
}
if (shipY < boundaryY2) {
if (goDown == true) {
shipY= shipY+speed;
laserY= laserY+speed;
}
}
if (shipY > boundaryY1) {
if (goUp == true) {
shipY= shipY-speed;
laserY= laserY-speed;
}
}
}
//LASER
void drawLaser() {
//Creates the laser if it fits parameters
if (laserOn == true) {
if (laserY > 0) {
fill(255, 255, 3, 200);
rect (laserX, laserY, 4, 20);
}
}
}
//MOVE LASER
void moveLaser() {
//Moves laser's x and y positions
if (laserOn == true) {
if (laserY > boundaryY1) {
laserY= laserY - laserspeed;
}
}
//Resets laser position after it hits Y value of 0
if (laserY <= boundaryY1) {
laserOn=false;
laserY=shipY;
}
}
//SCORE CHECKPOINTS AND EXTRAS
//Colour of gem changes based on achievement
void scoreAchievements() {
if (score == 10) {
println("LEARNING THE BASICS = Destroy 10 Asteroids. +1 SCORE");
gem2=220;
score = 11;
}
if (score == 20) {
println("GETTING THE HANG OF THIS = Destroy 20 Asteroids. +1 SCORE");
gem3=220;
score = 21;
}
if (score == 30) {
println("GALACTIC CRUSADER = Destroy 30 Asteroids. +1 SCORE");
gem1=20;
gem2=245;
gem3=20;
score = 31;
}
if (score == 50) {
println("Thats....alot of asteroids = Destroy 50 Asteroids. +1 SCORE");
gem1=10;
gem2=10;
gem3=240;
score = 51;
}
if (score == 70) {
println("Ok I think the threat is gone = Destroy 70 Asteroids. +1 SCORE");
gem1=210;
gem2=20;
gem3=160;
score = 71;
}
if (score == 100) {
println(".... = Destroy 100 Asteroids. +1 SCORE");
gem1=18;
gem2=18;
gem3=18;
score = 101;
}
if (shipX <= 45 && shipX >= 35 && shipY >= -30+(frameCount % 750)*2-5) {
if (shipY <= -30+(frameCount % 750)*2 + 5) {
if (bananaBlessed==false) {
println("You have recieved the mystical BANANA BLESSING");
noseColour=200;
bananaBlessed = true;
}
}
}
}
//BACKGROUND
void drawBackground() {
rectMode(CORNERS);
fill(8, 8, 8);
rect(0, 0, 400, 400);
}
/*REFERENCES
Controller Idea adapted from: http://www-acad.sheridanc.on.ca/PROG14998/2017/interactive-toy/darryl_feniquito_interactive_toy/index.html
Author: Darryl Feniquito
(Asteroid reset idea was based around their "switches" idea too)
Laser and asteroid collision adapted and improved from: http://www-acad.sheridanc.on.ca/PROG14998/2016/interactive-toy/ata_dogan_interactive_toy/index.html
Author: Ata Dogan
*/