//Coordinate Variables
float pressedX;
float pressedY;
float releaseX;
float releaseY;
float GrowingX;
float GrowingY;
//Logic variables
boolean release = false;
boolean running = false;
//colour coordination Variables
float colX;
float colY;
float colZ;
//Random motion variables
float xmotion;
float ymotion;
//misc Variables
float stress = 0;
float counter = 0;
float drag = 0;
//Visor stats
float visorpoint1Y = 111;
float visorpoint2Y = 119;
void setup() {
size(400, 400);
fill(50, 50, 50);
//background color
rect(0, 0, 400, 400);
//Instructions
print("Click and Drag to piss off Starman!");
}
void draw() {
//establish and give value to rise/run variables
float rise = getRise(pressedX, releaseX);
float run = getRun(pressedY, releaseY);
//release is set to true when the mouse is released and set to false when timetorock has has drawn a line off screen
if (release) {
timetorock(pressedX, pressedY, run, rise);
}
starmandraw();
updatevisor();
drawvisor();
if (stress >= 20) {
Starmanissickofyourgarbage();
}
}
void starmandraw() {
//makes Starman jitter more as he gets stressed
xmotion = random(-1, 1)*(stress/2);
ymotion = random(-1, 1)*(stress/2);
//So the whole thing can go -10 or +10 up down left or right
//Draw a bordered rectangle around him so that his infinite recursive instances are hidden
strokeWeight(3);
stroke(255, 255, 255);
fill(0, 0, 0);
rect(100, 59, 190, 280);
//resets to zero after it changes in timetorock
strokeWeight(0);
//StarmanHead
fill(198, 202, 246);
stroke(150, 153, 186);
triangle(200+xmotion, 80+ymotion, 180 +xmotion, 130+ymotion, 220+xmotion, 130+ymotion);
noStroke();
fill(0, 0, 0);
rect(180 +xmotion, 70+ymotion, 50, 35);
rect(190+xmotion, 110+ymotion, 20, 10);
//StarmanBody
fill(198, 202, 246);
stroke(150, 153, 186);
quad(160+xmotion, 130+ymotion, 240+xmotion, 130+ymotion, 230+xmotion, 210+ymotion, 170+xmotion, 210+ymotion);
fill(0, 0, 0);
triangle(210 +xmotion, 150+ymotion, 230 +xmotion, 150+ymotion, 220 +xmotion, 160+ymotion);
rect(205 +xmotion, 163+ymotion, 20, 10);
rect(205 +xmotion, 175+ymotion, 20, 7);
rect(228 +xmotion, 163+ymotion, 5, 10);
//Starman Arms
fill(198, 202, 246);
stroke(150, 153, 186);
triangle(160 +xmotion, 131+ymotion, 150 +xmotion, 160+ymotion, 130 +xmotion, 160+ymotion);
triangle(150 +xmotion, 160+ymotion, 130 +xmotion, 160+ymotion, 165 +xmotion, 200+ymotion);
triangle(140 +xmotion, 220+ymotion, 155 +xmotion, 190+ymotion, 166 +xmotion, 202+ymotion);
triangle(240 +xmotion, 131+ymotion, 250 +xmotion, 160+ymotion, 270 +xmotion, 160+ymotion);
triangle(250 +xmotion, 160+ymotion, 270 +xmotion, 160+ymotion, 235 +xmotion, 200+ymotion);
triangle(260 +xmotion, 220+ymotion, 245 +xmotion, 190+ymotion, 234 +xmotion, 202+ymotion);
//Starman Legs
triangle(170 +xmotion, 210+ymotion, 190 +xmotion, 210+ymotion, 175 +xmotion, 300+ymotion);
triangle(230 +xmotion, 210+ymotion, 210 +xmotion, 210+ymotion, 225 +xmotion, 300+ymotion);
//Starman Feet
ellipse(175 +xmotion, 293+ymotion, 30, 20);
ellipse(225 +xmotion, 293+ymotion, 30, 20);
}
void updatevisor() {
/*
add stress to the point so the lines will be moving faster at higher stress
decrement the values until they are for sure on the visor
*/
visorpoint1Y = visorpoint1Y + (stress/7.5);
visorpoint2Y = visorpoint2Y + (stress/7.5);
while (visorpoint1Y > 119) {
visorpoint1Y = visorpoint1Y-5;
}
while (visorpoint2Y > 119) {
visorpoint2Y = visorpoint2Y-5;
}
}
void drawvisor() {
//1st and 4th lines contain fixed X points at the end of the visor
stroke(200, 0, 0);
strokeWeight(1);
line(190+xmotion, 115+ymotion, 195+xmotion, visorpoint1Y+ymotion);
line(195+xmotion, visorpoint1Y+ymotion, 200+xmotion, visorpoint2Y+ymotion);
line(200+xmotion, visorpoint2Y+ymotion, 205+xmotion, visorpoint1Y+ymotion);
line(205+xmotion, visorpoint1Y+ymotion, 210+xmotion, 115+ymotion);
}
//establish point where drag begins
void mousePressed() {
pressedX = mouseX;
pressedY = mouseY;
}
//establish point where drag ends
void mouseReleased() {
releaseX = mouseX;
releaseY = mouseY;
//checks the two points are not identical
if (releaseX!=pressedX || releaseY!=pressedY) {
release = true;
}
}
//establishes rise variables
float getRise(float Y1, float Y2) {
float rise = Y1-Y2;
return rise;
}
//established run values
float getRun(float X1, float X2) {
float run = X1-X2;
return run;
}
void timetorock(float X1, float Y1, float rise, float run) {
//Establishing the incrementing variables
if (!running) {
GrowingX = X1;
GrowingY = Y1;
}
//moving the first point of the line off-screen
while ((GrowingX > 0 && GrowingX < 400) && (GrowingY > 0 && GrowingY < 400)&& !running) {
GrowingX = GrowingX+run;
GrowingY = GrowingY+rise;
}
//sets Running to true so the line will not continue resetting until the pattern is complete
running = true;
//handling colors
if (counter == 3) {
counter = 0;
}
if (counter == 0) {
colX = 255;
colY = 0;
colZ = 0;
}
if (counter == 1) {
colX = 0;
colY = 0;
colZ = 255;
}
if (counter == 2) {
colX = 255;
colY = 255;
colZ = 0;
}
//Draws lines behind each other in different transparencies
stroke(colX, colY, colZ, 255);
strokeWeight(6);
line(GrowingX, GrowingY, GrowingX-run, GrowingY-rise);
stroke(colX, colY, colZ, 150);
strokeWeight(20);
line(GrowingX, GrowingY, GrowingX-run, GrowingY-rise);
stroke(colX, colY, colZ, 50);
strokeWeight(50);
line(GrowingX, GrowingY, GrowingX-run, GrowingY-rise);
//increments the starting values of the lines to continue the pattern
GrowingX = GrowingX-run;
GrowingY = GrowingY-rise;
// If the method is running and the values are offscreen, the method will stop being called every frame
if (running) {
if (GrowingX > 400 || GrowingX < 0 || GrowingY > 400 || GrowingY < 0) {
running = false;
release = false;
counter++;
stress++;
}
}
}
void Starmanissickofyourgarbage() {
//Draw Rectangle over patterns and old background
fill(50, 50, 50);
stroke(0, 0, 0);
rect(0, 0, drag, 400);
starmandraw();
//Draw Beam
fill(255, 255, 0);
stroke(255, 225, 0);
strokeWeight(3);
triangle(200+xmotion, 90+ymotion, drag, 0, drag, 400);
if (drag > 400) {
stress = 0;
//draw another rectangle to delete the remnants of the beam
fill(50, 50, 50);
stroke(50,50,50);
rect(0, 0, 400, 400);
drag = -5;
}
//increase drag so the beam moves across the screen
drag = drag+5;
}