//////////////////////////////////////////////////////////////////////////////
// Satallite flyer //
// \\ // //
// Ethan Davis //
// //
//This is an interactive toy of a Satallite. //
//You can fly it around the screen with space like physics and acceleration.//
//Hitting the edge of the screen will make the satallite bounce //
//Flying close to the planet will have a gravitational pull towards it. //
//Clicking turns on your beacon //
// //
//////////////////////////////////////////////////////////////////////////////
//Variables that control the stars
float StarGlow1 = 2;
float StarGrow1 = 0.5;
float StarGlow2 = 5;
float StarGrow2 = 0.5;
float StarGlow3 = 10;
float StarGrow3 = 0.5;
//variables that control the planet
float PlanetX = 300;
float PlanetY = 300;
float R = random(0, 255);
float G = random(0, 255);
float B = random(0, 255);
//variables that control the satallite
float xSpeed = 0;
float ySpeed = 0;
float SatX = 200;
float SatY = 200;
float SatLight = 10;
float SatGrow = 1.5;
//variables that the user interacts with
boolean UP = false;
boolean DOWN = false;
boolean LEFT = false;
boolean RIGHT = false;
boolean CLICK = false;
void setup() {
size(400, 400);
rectMode(CENTER);
}
void draw() {
background(0);
PlanetGravity();
movement();
drawStars();
//This grid was a personal grid I looped for location refrence when needed.
//drawGrid();
drawPlanets();
drawThrusters();
drawSatalite();
}
void drawStars() {
//Draw Gradient that follows the planet
//This creates a light effect for the planet
noStroke();
int x = 1000;
float c = 0;
c = constrain (c, 0, 255);
while (x >= 0) {
fill(c);
ellipse(PlanetX, PlanetY, x, x);
x = x - 50;
c = c + 3;
}
//Draw the star glow
rect(100, 10, 3, 3);
fill(255, 100);
rect(225, 225, StarGlow1, StarGlow1);
rect(350, 125, StarGlow1, StarGlow1);
rect(75, 200, StarGlow1, StarGlow1);
rect(125, 100, StarGlow1, StarGlow1);
rect(123, 294, StarGlow2, StarGlow2);
rect(360, 380, StarGlow2, StarGlow2);
rect(372, 342, StarGlow2, StarGlow2);
rect(300, 300, StarGlow2, StarGlow2);
rect(235, 99, StarGlow3, StarGlow3);
rect(100, 10, StarGlow3, StarGlow3);
rect(26, 78, StarGlow3, StarGlow3);
rect(146, 360, StarGlow3, StarGlow3);
fill(255);
//Draw the Stars
rect(225, 225, 3, 3);
rect(350, 125, 3, 3);
rect(75, 200, 3, 3);
rect(125, 100, 3, 3);
rect(123, 294, 3, 3);
rect(360, 380, 3, 3);
rect(372, 342, 3, 3);
rect(300, 300, 3, 3);
rect(235, 99, 3, 3);
rect(100, 10, 3, 3);
rect(26, 78, 3, 3);
rect(146, 360, 3, 3);
//Make the glowing star light expand and revert
//This creates the glowing effect on the stars
if (StarGlow1 >= 10|| StarGlow1 <= 0.5) {
StarGrow1 = StarGrow1 * -1;
}
StarGlow1 = StarGlow1 + StarGrow1;
if (StarGlow2 >= 10|| StarGlow2 <= 0.2) {
StarGrow2 = StarGrow2 * -1;
}
StarGlow2 = StarGlow2 + StarGrow2;
if (StarGlow3 >= 10|| StarGlow3 <= 0.7) {
StarGrow3 = StarGrow3 * -1;
}
StarGlow3 = StarGlow3 + StarGrow3;
}
void drawGrid() {
//Draw a line grid for personal refrence
//This helped me finalize spacing
float x = 50;
float y = 50;
line (50, 0, 50, 400);
stroke(255);
strokeWeight(1);
while (x <= 400) {
line(x, 0, x, 400);
x = x+50;
}
while (y <=400) {
line (0, y, 400, y);
y = y+50;
}
}
void drawPlanets() {
//Make the planet spin in a circle
//It will spin on a large axis around the center, slowly
PlanetX = 200-(cos((frameCount-28)*0.0015)*200);
PlanetY = 200-(sin((frameCount-28)*0.0015)*200);
//Give the planet a random colour every time the sketch is run
fill(R, G, B);
ellipse(PlanetX, PlanetY, 100, 100);
//Fill craters with same random colour, only darker
fill(R-20, G-20, B-20);
ellipse(PlanetX-25, PlanetY-25, 20, 20);
ellipse(PlanetX+10, PlanetY+10, 10, 10);
ellipse(PlanetX+20, PlanetY-10, 15, 15);
ellipse(PlanetX-25, PlanetY+17, 17, 17);
ellipse(PlanetX-5, PlanetY-30, 5, 5);
}
void drawSatalite() {
//Satallite base
stroke(150);
strokeWeight(3);
line(SatX-10, SatY-10, SatX+10, SatY+10);
noStroke();
fill(200);
rect(SatX, SatY, 16, 16);
//Yellow glass
fill(121, 98, 33);
ellipse(SatX-3, SatY+3, 7, 7);
fill(240, 204, 106);
ellipse(SatX-3, SatY+3, 5, 5);
//WINGS
fill(21, 36, 129);
quad(SatX, SatY-20, SatX-40, SatY-50, SatX-50, SatY-40, SatX-20, SatY);
quad(SatX, SatY+20, SatX+40, SatY+50, SatX+50, SatY+40, SatX+20, SatY);
///Details on Wings\\\
stroke(50);
strokeWeight(1.5);
//Left Wing
line(SatX-45, SatY-45, SatX-10, SatY-10);
line(SatX-27, SatY-12, SatX-12, SatY-27);
line(SatX-37, SatY-25, SatX-25, SatY-37);
line(SatX-45, SatY-35, SatX-35, SatY-45);
//Right Wing
line(SatX+45, SatY+45, SatX+10, SatY+10);
line(SatX+27, SatY+12, SatX+12, SatY+27);
line(SatX+37, SatY+25, SatX+25, SatY+37);
line(SatX+45, SatY+35, SatX+35, SatY+45);
////////Reflections help give the appearance of solar panels\\\\\\\\
//Left Wing reflection
noStroke();
fill(91, 102, 170);
ellipse(SatX-38, SatY-45, 3, 3);
ellipse(SatX-30, SatY-38, 5, 5);
ellipse(SatX-18, SatY-28, 8, 8);
ellipse(SatX-7, SatY-20, 8, 8);
//Right Wing Reflection
ellipse(SatX+48, SatY+41, 3, 3);
ellipse(SatX+42, SatY+34, 5, 5);
ellipse(SatX+32, SatY+24, 8, 8);
ellipse(SatX+22, SatY+10, 8, 8);
//Draw Click lights/alter appearence
//Use a boolean statement to toggle the effect, isntead of holding the mouse down
if (CLICK == true) {
fill(255, 0, 0, 100);
noStroke();
ellipse(SatX+7, SatY-7, SatLight, SatLight);
fill(255, 0, 0);
noStroke();
ellipse(SatX+7, SatY-7, 5, 5);
//Make Satallite lights flicker
//Ellipse expands and shrinks making it look like a signal
if (SatLight >= 30 || SatLight <= 0.5) {
SatGrow = SatGrow * -1;
}
SatLight = SatLight + SatGrow;
} else {
//Toggle the lights off
fill(150, 0, 0);
noStroke();
ellipse(SatX+7, SatY-7, 5, 5);
}
}
void movement() {
//Accelerate UP
//Boolean statements combined with keypressed and keyreleased helped
//the satallite move in multiple directions at one time
if (UP == true) {
ySpeed = ySpeed - 0.02;
}
//Accelerate DOWN
if (DOWN == true) {
ySpeed = ySpeed + 0.02;
}
//Accelerate LEFT
if (LEFT == true) {
xSpeed = xSpeed - 0.02;
}
//Accelerate RIGHT
if (RIGHT == true) {
xSpeed = xSpeed + 0.02;
}
//Slow down motion Y
if (ySpeed < 0) {
ySpeed = ySpeed + 0.01;
//force speed to 0 so it doesn't go backwards
if (ySpeed > 0) {
ySpeed =0;
}
}
if (ySpeed > 0) {
ySpeed = ySpeed - 0.01;
if (ySpeed < 0) {
ySpeed = 0;
}
}
//Slow down motion X
if (xSpeed < 0) {
xSpeed = xSpeed + 0.01;
if (xSpeed > 0) {
xSpeed = 0;
}
}
if (xSpeed > 0) {
xSpeed = xSpeed - 0.01;
if (xSpeed < 0) {
xSpeed = 0;
}
}
//Constrain The satalite to the canvas
//by bouncing off the edges instead of using constrain
if (SatY <= 0) {
ySpeed = ySpeed * -1;
}
if (SatY >= width) {
ySpeed = ySpeed * -1;
}
if (SatX <= 0) {
xSpeed = xSpeed * -1;
}
if (SatX >=height) {
xSpeed = xSpeed * -1;
}
//Apply the speed to Satalite
//This allows it to move and accelerate
SatY = SatY + ySpeed;
SatX = SatX + xSpeed;
//Constrain speed so it's not infinite
//Without this, the satallite could infinately buyild up speed
ySpeed = constrain(ySpeed, -2, 2);
xSpeed = constrain(xSpeed, -2, 2);
}
void keyPressed() {
//Check what keys are pressed
//Recognize Up
if (key == 'w' || key == 'W') {
UP = true;
}
//Recognize Down
if (key == 's' || key == 'S') {
DOWN = true;
}
//Recognize Left
if (key == 'a' || key == 'A') {
LEFT = true;
}
//Recognize Right
if (key == 'd' || key == 'D') {
RIGHT = true;
}
}
void keyReleased() {
//Check when keys are released
//Recognize Up
if (key == 'w' || key == 'W') {
UP = false;
}
//Recognize Down
if (key == 's' || key == 'S') {
DOWN = false;
}
//Recognize Left
if (key == 'a' || key == 'A') {
LEFT = false;
}
//Recognize Right
if (key == 'd' || key == 'D') {
RIGHT = false;
}
}
void PlanetGravity() {
//Create four quadrants to pull the satallite
//depending on the quadrant it's in, it will pull the satallite towards the center of the planet
//Top Left Quad
if (SatX >= PlanetX - 100 && SatX < PlanetX && SatY >= PlanetY - 100 && SatY < PlanetY) {
xSpeed = xSpeed + 0.007;
ySpeed = ySpeed + 0.007;
}
//Top Right Quad
if (SatX <= PlanetX + 100 && SatX > PlanetX && SatY >= PlanetY - 100 && SatY < PlanetY) {
xSpeed = xSpeed - 0.007;
ySpeed = ySpeed + 0.007;
}
//Bottom Left Quad
if (SatX >= PlanetX - 100 && SatX < PlanetX && SatY <= PlanetY + 100 && SatY > PlanetY) {
xSpeed = xSpeed + 0.007;
ySpeed = ySpeed - 0.007;
}
//Bottom Right Quad
if (SatX <= PlanetX + 100 && SatX > PlanetX && SatY <= PlanetY + 100 && SatY > PlanetY) {
xSpeed = xSpeed - 0.007;
ySpeed = ySpeed - 0.007;
}
}
void drawThrusters() {
float Random = random(20, 30);
float Random2 = random(5, 15);
noStroke();
//Thrusters when flying up
if (UP == true) {
fill(160, 27, 209);
triangle(SatX, SatY+ 5 +Random, SatX-5, SatY+5, SatX+5, SatY+5);
fill(210, 110, 247);
triangle(SatX, SatY+ 5 +Random2, SatX-5, SatY+5, SatX+5, SatY+5);
}
//Thrusters when flying down
if (DOWN == true) {
fill(160, 27, 209);
triangle(SatX, SatY- 5 +(-1*Random), SatX-5, SatY-5, SatX+5, SatY-5);
fill(210, 110, 247);
triangle(SatX, SatY- 5 +(-1*Random2), SatX-5, SatY-5, SatX+5, SatY-5);
}
//Thrusters when flying Right
if (RIGHT == true) {
fill(160, 27, 209);
triangle(SatX- 5 +(-1*Random), SatY, SatX, SatY-5, SatX, SatY+5);
fill(210, 110, 247);
triangle(SatX- 5 +(-1*Random2), SatY, SatX, SatY-5, SatX, SatY+5);
}
//Thrusters when flying Left
if (LEFT == true) {
fill(160, 27, 209);
triangle(SatX+ 5 +Random, SatY, SatX, SatY-5, SatX, SatY+5);
fill(210, 110, 247);
triangle(SatX+ 5 +Random2, SatY, SatX, SatY-5, SatX, SatY+5);
}
}
void mousePressed() {
//Reset light so it always starts small when activated
SatLight = 1;
//Toggle using boolean so the light stays on untill clicked again
if (CLICK == false) {
CLICK = true;
} else if (CLICK == true) {
CLICK = false;
}
}