/*
Robot Interactive Toy
Author: Jonathon Klassen
Date: October 3, 2015
*/
PVector pos; //toy position
PVector fPos; //firework position
float rLeg; //right leg y position
float lLeg; //left leg y position
float jSpeed=8; //jump speed
float[] starPosx = new float[40]; //stars' x positions
float[] starPosy = new float[40]; //stars' y position
int speed=1; //leg move speed
int fSpeed=1; //firework speed
int dir=0; //horizontal direction indicator
int state=0; //walking state
int fState=0; //firework state
int fireSize=0; //firework size
color f = color(random(0, 255), random(0, 255), random(0, 255)); //firework color
boolean walk = false; //whether toy is moving
boolean jump = false; //whether toy is jumping
boolean launch = false; //whether firework has launched
void setup() {
size(600, 600); //set screen size
pos = new PVector(200, 295); //set toy position
fPos = new PVector(300, 400); //set firework position
rLeg = pos.y+53; //set right leg position in relation to toy position
lLeg = pos.y+53; //set left leg position in relation to toy position
//for loop which randomizes star positions
for (int i=0; i<starPosx.length; i++) {
starPosx[i] = random(5, 600); //randomize stars' x positions
starPosy[i] = random(0, 370); //randomize stars' y positions
}
rectMode(CENTER);
}
void draw() {
background(7, 14, 80);
firework(); //function which handles the firework
strokeWeight(3);
stroke(0);
fill(255);
drawBackground(); //function which draws the background
drawBot(); //function which draws majority of toy
turnAround(); //function which draws reflecting parts of toy
moveToy(); //function which handles walking
doJump(); //function which handles jumping
boundaries(); //function which keeps toy on screen
fill(50, 50, 50, 100);
rect(300, 300, 610, 610); //apply filter on screen
}
void drawBackground() {
noStroke();
fill(244, 250, 162, 200);
ellipse(40, 40, 200, 200); //draw moon
//for loop which draws stars
for (int i=0; i<starPosx.length; i++) {
stroke(255);
ellipse(starPosx[i], starPosy[i], 5, 5); //draw stars
}
stroke(0);
fill(5, 62, 5);
//draw hills
ellipse(450, 300, 400, 150);
ellipse(180, 300, 400, 100);
fill(10);
rect(300, 375, 600, 150); //draw road
//for loop which draws road markings
for (int i=0; i<6; i++) {
fill(210, 210, 0);
rect(50+i*100, 350, 50, 10); //draw road markings
}
fill(5, 62, 5);
rect(300, 525, 600, 150); //draw grass
}
void drawBot() {
fill(30);
rect(pos.x+20, rLeg, 20, 40); //draw right leg
rect(pos.x-20, lLeg, 20, 40); //draw left leg
fill(80);
rect(pos.x, pos.y, 80, 120, 5); //draw body
fill(111, 57, 0);
rect(pos.x, pos.y+43, 80, 5); //draw belt
fill(80);
rect(pos.x, pos.y-75, 30, 40); //draw firework pipe
fill(50);
ellipse(pos.x, pos.y-62, 80, 45); //draw hunch
}
void turnAround() {
if (dir == 0) { //if the robot is walking right
//draw the following parts oriented right
fill(80);
rect(pos.x+20, pos.y+10, 40, 60); //draw body door
line(pos.x+30, pos.y, pos.x+30, pos.y+40); //draw seam
//for loops which draws buttons
for (int i=0; i<4; i++) {
for (int j=0; j<2; j++) {
fill(185, 185, 0);
ellipse(pos.x+25-15*j, pos.y+i*12-3, 5, 5); //draw button
}
}
fill(100);
ellipse(pos.x+30, pos.y-30, 40, 40); //draw head
fill(182, 32, 15);
ellipse(pos.x+42, pos.y-35, 15, 15); //draw eye
fill(50);
rect(pos.x+33, pos.y-13, 40, 20); //draw jaw
fill(120);
rect(pos.x+42, pos.y-50, 25, 28, 5); //draw hat
rect(pos.x+30, pos.y-55, 43, 38, 5);
rect(pos.x+19, pos.y-50, 25, 28, 5);
fill(255, 255, 0);
ellipse(pos.x+42, pos.y-55, 7, 14);
//if the toy isn't jumping
if (jump == false) {
fill(90);
rect(pos.x-19, pos.y+5, 15, 60); //draw arm upwards
fill(50);
rect(pos.x-19, pos.y+25, 21, 10); //draw cuff upwards
//otherwise
} else if (jump == true) {
fill(90);
rect(pos.x-19, pos.y-35, 15, 60); //draw arm downwards
fill(50);
rect(pos.x-19, pos.y-55, 21, 10); //draw cuff downwards
}
ellipse(pos.x-19, pos.y-15, 25, 25); //draw shoulder
} else if (dir == 1) { //if the robot is walking left
//draw the following parts oriented left
fill(80);
rect(pos.x-20, pos.y+10, 40, 60); //draw body door
line(pos.x-30, pos.y, pos.x-30, pos.y+40); //draw seam
//for loop which draws buttons
for (int i=0; i<4; i++) {
fill(185, 185, 0);
ellipse(pos.x-35, pos.y+i*12-3, 5, 5); //draw button
}
fill(100);
ellipse(pos.x-30, pos.y-30, 40, 40); //draw head
fill(182, 32, 15);
ellipse(pos.x-42, pos.y-35, 15, 15); //draw eye
fill(50);
rect(pos.x-33, pos.y-13, 40, 20); //draw jaw
fill(120);
rect(pos.x-42, pos.y-50, 25, 28, 5); //draw hat
rect(pos.x-30, pos.y-55, 43, 38, 5);
rect(pos.x-19, pos.y-50, 25, 28, 5);
fill(255, 255, 0);
ellipse(pos.x-42, pos.y-55, 7, 14);
//if the toy isn't jumping
if (jump == false) {
fill(90);
rect(pos.x+19, pos.y+5, 15, 60); //draw arm upwards
fill(50);
rect(pos.x+19, pos.y+25, 21, 10); //draw cuff upwards
//otherwise
} else if (jump == true) {
fill(90);
rect(pos.x+19, pos.y-35, 15, 60); //draw arm downwards
fill(50);
rect(pos.x+19, pos.y-55, 21, 10); //draw cuff downwards
}
ellipse(pos.x+19, pos.y-15, 25, 25); //draw shoulder
}
}
void moveToy() {
//if the "d" key is pressed
if (keyPressed && key == 'd' || key == 'D') {
walk=true; //recognize the toy is walking
pos.x+=2; //move the toy right
dir=0; //set the toy's direction to right
//if the "a" key is pressed
} else if (keyPressed && key == 'a' || key == 'A') {
walk=true; //recognize the toy is walking
pos.x-=2; //move the toy left
dir=1; //set the toy's direction to left
//otherwise
} else {
walk=false; //recognize the toy is not moving
}
//if the toy isn't walking, or is in the midst of jumping
if (walk == false || walk == true && jump == true) {
rLeg = pos.y+58; //reset right leg position
lLeg = pos.y+58; //reset left leg position
state=0; //reset walking state
}
//if the toy is walking, and isn't jumping
if (walk == true && jump == false) {
//if the walking state is 0
if (state == 0) {
rLeg = pos.y+53; //set right leg position slightly higher
lLeg = pos.y+53; //set left leg position slightly higher
state=1; //proceed to next walking state
}
//if the walking state is 1
if (state == 1) {
rLeg +=speed; //move the right leg downwards
lLeg -=speed; //move the left leg upwards
//if the right leg moves too high or too low
if (rLeg >= pos.y+60 || rLeg <=pos.y+46) {
speed*=-1; //reverse both legs' directions
}
}
}
}
void doJump() {
//if the "w" key is pressed
if (keyPressed && key == 'w' || key == 'W') {
jump = true; //the toy is jumping
walk = false; //the toy is not walking
//otherwise if the toy is coming down after a jump
} else if (jSpeed < -8) {
jump=false; //the toy is no longer jumping
pos.y=295; //reset the toy's y position to its default
}
//if the toy is jumping
if (jump == true) {
pos.y-=jSpeed; //subtract jump speed from the toy's y position
jSpeed-=0.3; //reduce jump speed to bring the toy back down
}
//if the toy is no longer jumping
if (jump == false) {
jSpeed = 8; //reset jump speed
}
}
void boundaries() {
//if the toy accidentally skips downwards
if (pos.y+80 > 375) {
jump=false; //ensure the toy isn't jumping
pos.y = 295; //reset the toy's y position
}
//if the toy goes too far right
if (pos.x >= width+60) {
pos.x = -50; //relocate toy to left side of screen
}
//if the toy goes too far left
if (pos.x <=-60) {
pos.x = 650; //relocate toy to right side of screen
}
}
void firework() {
//if the firework has detonated
if (fState == 1) {
noFill(); //make the original firework invisible
noStroke();
} else { //otherwise
fill(255); //make the original firework visible
noStroke();
}
ellipse(fPos.x, fPos.y, 5, 5); //draw the firework
//if the space key is pressed and the firework hasn't launched
if (keyPressed && key == ' ') {
launch = true; //launch the firework
}
//if the firework hasn't launched
if (launch == false) {
fPos.x = pos.x; //reset firework x position beneath the player
fPos.y = pos.y+50; //reset firework y position
fState=0; //reset firework state
}
//if the firework has launched
if (launch == true) {
//if the firework state is 0
if (fState == 0) {
fPos.x+=random(-3, 3); //randomize the x position slightly
fPos.y-=5; //launch it upwards
//if the firework reaches the upper limits of the screen
if (fPos.y <=int(random(30, 80))) {
fState=1; //set firework state to 1
}
}
//if the firework state is 1
if (fState == 1) {
fill(255, 255, 255, 255-fireSize*10);
strokeWeight(10);
stroke(f, 255-fireSize*3);
//draw one ring of the firework explosion
ellipse(fPos.x, fPos.y, 20+5*fireSize, 20+5*fireSize);
//for loop which draws firework sparkles
for (int i=0; i<10; i++) {
strokeWeight(2);
//draw random sparkles below firework
ellipse(fPos.x+random(-50, 50), fPos.y+random(20+5*fireSize), 5, 5);
}
fireSize++; //add 1 to firework size
//if the firework size reaches 20
if (fireSize ==20) {
launch = false; //reset the firework
fireSize=0; //reset firework size
f = color(random(0, 255), random(0, 255), random(0, 255)); //randomize firework color
}
}
}
}