////////////////////Interactive Toy/////////////////// //////////////////Hoverball_basement////////////////// ////////////////////By Gavin Nelson/////////////////// //This toy gives the you many options to alter the//// //environment. The swiches on the right side will///// //alter the scene in different ways. Play around to/// //find out what you can do. There is a game mode////// //that will randomize the x direction of the ball///// ////////////////////////////////////////////////////// //Switches boolean roomLight = false; boolean gameMode = false; boolean raveMode = false; boolean raveModeFlag = false; boolean playModeRestartFlag = false; float redToggle = 245; float redToggleValue; float greenToggle = 245; float greenToggleValue; float blueToggle = 245; float blueToggleValue; float value; float red; float blue; float green; float playingBlockX = 162.5; float playingBlockY = 50; float playingBlockWeight = 0.1; float playingBlockYMovement = 0; float playingBlockYAcceleration = 2; float playingBlockXMovement = 0; int redFloor = 30; int greenFloor = 60; int blueFloor = 90; int toggleLocation; void setup() { size(400, 400); background(0); frameRate(60); println("Play around and see what you can do! My basement hoverball setup is ready to go"); println("click on the control panel to play with the lights! Or use w-a-s-d to play with the ball"); } //Main Block void draw() { rectMode(CENTER); noStroke(); fill(0); if (gameMode == true) { fill(100 + 50 * sin(frameCount * 0.3)); } rect(200, 200, 400, 400); layerOne(); layerTwo(); layerThree(); layerFour(); } ///////////////////////////////////////////////// ////////////////////Layer One//////////////////// ///////////////////////////////////////////////// void layerOne() { //Universal counters int i = 0; int x = 0; ///////////// //Back wall// ///////////// rectMode(CORNERS); fill(100); rect(80, 0, 400, 320); rectMode(CENTER); strokeWeight(2); stroke(50); //Back wall horizontal mortar while (i<=8) { line(80, i*40, 400, i*40); i++; } i = 0; //Back wall vertical mortar line(80, 0, 80, 320); while (i<=8) { if (i%2 == 0) { while (x<4) { line(160+i*40, x*80, 160+i*40, 40+x*80); x++; } x = 0; } if (i%2 == 1) { while (x<4) { line(80+i*40, 40+x*80, 80+i*40, 80+x*80); x++; } x = 0; } i++; } i = 0; ///////////// //Left wall// ///////////// quad(0, 0, 80, 0, 80, 320, 0, 400); //Left wall horizontal mortar strokeWeight(1.4); while (i <8) { line(80, 40+i*40, 0, 50+i*50); i++; } i = 0; //Left wall vertical mortar while (i<8) { if (i%2 == 0) { while (x<4) { line(40, 0+i*45, 40, 45+i*45); x++; } x = 0; } if (i%2 == 1) { while (x<4) { line(60, 0+i*42.5, 60, 42.5+i*42.5); line(20, 0+i*47.5, 20, 47.5+i*47.5); x++; } x = 0; } i++; } i = 0; ///////// //Floor// ///////// if (raveMode == true) { fill(redFloor, greenFloor, blueFloor); } else if (raveMode == false) { fill(200); stroke(50); strokeWeight(1); } while (i < 10) { quad(80+i*80, 320, 120+i*80, 320, 85+i*85, 360, 42.5+i*85, 360); quad(85+i*85, 360, 127.5+i*85, 360, 95+i*90, 400, 50+i*90, 400); i++; redFloor = 100+ (redFloor +35) % 255; greenFloor = 100+ (greenFloor +35) % 255; blueFloor = 100+ (blueFloor +35) % 255; } ///////// //Light// ///////// //Electrical feed strokeWeight(4); stroke(150); line(300, 25, 300, 100); line(300, 100, 400, 100); noStroke(); //Light bulb and fixture if (roomLight == true) { fill(255, 255, 0); } if (roomLight == false) { fill(255, 255, 0, 40); } ellipse(300, 25, 20, 20); rect(300, 35, 10, 10, 10); fill(230); rect(300, 45, 20, 20, 10); //Light emission if (roomLight == true && raveMode == false) { radiantLight(255, 255, 0, 300, 25, 20, 20, 255, 4); } } ///////////////////////////////////////////////// ////////////////////Layer Two//////////////////// ///////////////////////////////////////////////// void layerTwo() { ///////////////// //Control panel// ///////////////// rectMode(CORNERS); //Control panel shadow if (roomLight == true) { noStroke(); fill(0, 150); triangle(300, 375, 350, 600, 500, 375); } //Control panel legs stroke(105, 59, 0); strokeWeight(6); line(310, 375, 310, 380); line(390, 375, 390, 380); //Control panel face noStroke(); fill(155, 109, 50); rect(300, 125, 400, 375); fill(205, 159, 100); quad(300, 125, 325, 100, 400, 100, 400, 125); /////////////////////////////////////////////// //Control panel Labelling, Switches and Logic// /////////////////////////////////////////////// textAlign(CENTER); fill(0); textSize(10); //Room Light rectMode(CENTER); stroke(0); strokeWeight(1); fill(150); rect(350, 170, 60, 20); fill(0); if (mouseX >320 && mouseX < 385 && mouseY > 130 && mouseY < 180) { noFill(); strokeWeight(4); stroke(255, 255, 0); rect(350, 170, 60, 20); fill((frameCount*6)%255, (frameCount*4)%255, (frameCount*2)%255); if (mousePressed && roomLight == true) { roomLight = false; //delay(50); } else if (mousePressed && roomLight == false) { roomLight = true; //delay(50); } } text("Room Light", 350, 150); //Board Lights stroke(0); strokeWeight(1); fill(150); rect(320, 230, 10, 35); rect(350, 230, 10, 35); rect(380, 230, 10, 35); fill(0); if (mouseX >315 && mouseX < 385 && mouseY > 180 && mouseY < 250) { noFill(); strokeWeight(4); stroke(255, 255, 0); if (mouseX >315 && mouseX < 338 && mouseY > 180 && mouseY < 250) { rect(320, 230, 10, 35); } if (mouseX >338 && mouseX < 361 && mouseY > 180 && mouseY < 250) { rect(350, 230, 10, 35); } if (mouseX >361 && mouseX < 385 && mouseY > 180 && mouseY < 250) { rect(380, 230, 10, 35); } fill((frameCount*6)%255, (frameCount*4)%255, (frameCount*2)%255); } text("Board Lights", 350, 200); //Game mode stroke(0); strokeWeight(1); fill(150); rect(350, 280, 60, 20); fill(0); if (mouseX >315 && mouseX < 385 && mouseY > 250 && mouseY < 300) { noFill(); strokeWeight(4); stroke(255, 255, 0); rect(350, 280, 60, 20); fill((frameCount*6)%255, (frameCount*4)%255, (frameCount*2)%255); if (mousePressed && gameMode == true) { gameMode = false; //delay(100); } else if (mousePressed && gameMode == false) { gameMode = true; println("Oh i'm sorry, the parts for the game haven't come in yet. The score board and nets should be coming in soon"); println("feel free to play with its wacky setting though"); //delay(100); } } text("Game Mode", 350, 260); //Basement rave stroke(0); strokeWeight(1); fill(150); rect(350, 330, 60, 20); fill(0); if (mouseX >315 && mouseX < 390 && mouseY > 300 && mouseY < 350) { noFill(); strokeWeight(4); stroke(255, 255, 0); rect(350, 330, 60, 20); fill((frameCount*6)%255, (frameCount*4)%255, (frameCount*2)%255); if (mousePressed && raveMode == true) { raveMode = false; //delay(100); } else if (mousePressed && raveMode == false) { raveMode = true; println("Party Time!!!"); } } text("Basement Rave", 350, 310); fill(0); /////////// //Board// /////////// //Back section fill(45, 30, 15); stroke(0); strokeWeight(1); rectMode(CORNERS); rect(100, 50, 225, 275); fill(145, 130, 115); quad(100, 50, 105, 45, 230, 45, 225, 50); quad(225, 50, 230, 45, 230, 270, 225, 275); fill(245, 230, 215); rect(105, 55, 220, 270); fill(255, 50, 50); stroke(50, 50, 255); strokeWeight(1); triangle(162.5, 70, 215, 100, 110, 100); triangle(162.5, 250, 215, 220, 110, 220); rect(110, 165, 215, 168); fill(245, 230, 215); noStroke(); triangle(162.5, 75, 215, 105, 110, 105); triangle(162.5, 245, 215, 215, 110, 215); fill(redToggleValue, 50, 50); quad(122.5, 125, 132.5, 175, 122.5, 225, 112.5, 175); fill(0, 50 + greenToggleValue, 50); quad(162.5, 125, 172.5, 175, 162.5, 225, 152.5, 175); fill(0, 50, 50 + blueToggleValue); quad(202.5, 125, 212.5, 175, 202.5, 225, 192.5, 175); radiantLight(redToggleValue, 0, 0, 122.5, 175, 10, 100, redToggleValue * 0.05, 10); radiantLight(0, greenToggleValue, 0, 162.5, 175, 10, 100, greenToggleValue * 0.05, 10); radiantLight(0, 0, blueToggleValue, 202.5, 175, 10, 100, blueToggleValue * 0.05, 10); //Stand-offs fill(200); stroke(0); ellipse(105, 55, 10, 10); ellipse(220, 55, 10, 10); ellipse(105, 270, 10, 10); ellipse(220, 270, 10, 10); ellipse(100, 60, 10, 10); ellipse(215, 60, 10, 10); ellipse(100, 275, 10, 10); ellipse(215, 275, 10, 10); //Pegs rectMode(CENTER); fill(50); rect(130, 110, 10, 10); rect(195, 110, 10, 10); rect(162.5, 160, 10, 10); rect(130, 210, 10, 10); rect(195, 210, 10, 10); rect(162.5, 260, 10, 10); } /////////////////////////////////////////////////// ////////////////////Layer Three//////////////////// /////////////////////////////////////////////////// void layerThree() { ///////////////// //Playing Block// ///////////////// fill(255); strokeWeight(1); stroke(0); playingBlockX = playingBlockX + playingBlockXMovement; playingBlockYMovement = (playingBlockWeight * playingBlockYAcceleration) + playingBlockYMovement; playingBlockY = playingBlockY + playingBlockYMovement; if (gameMode == true) { if (frameCount % 10 == 0) { playingBlockXMovement = random(10) - 5; } } if (playingBlockX <= 100) { playingBlockX = 100; playingBlockXMovement = 0; } if (playingBlockX >= 210) { playingBlockX = 210; playingBlockXMovement = 0; } if (playingBlockY <= 50) { playingBlockY = 50; playingBlockYMovement =0; } if (playingBlockY >= 330) { playingBlockY = 330; playingBlockYMovement = 0; playingBlockXMovement = 0; playingBlockWeight = 0.1; if (playModeRestartFlag == false) { println("press R to replace the ball"); playModeRestartFlag = true; } } if (playingBlockY > 300) { playingBlockWeight = 0.4; } if (playingBlockY + 10 > 105 && playingBlockY < 115 && playingBlockX > 115 && playingBlockX < 145) { playingBlockXMovement = 1; playingBlockYMovement = 1; } if (playingBlockY + 10 > 105 && playingBlockY < 115 && playingBlockX > 180 && playingBlockX < 210) { playingBlockXMovement = 1; playingBlockYMovement = 1; } if (playingBlockY + 10 > 155 && playingBlockY < 165 && playingBlockX > 147.5 && playingBlockX < 172.5) { playingBlockXMovement = 1; playingBlockYMovement = 1; } if (playingBlockY + 10 > 205 && playingBlockY < 215 && playingBlockX > 115 && playingBlockX < 145) { playingBlockXMovement = 1; playingBlockYMovement = 1; } if (playingBlockY + 10 > 205 && playingBlockY < 215 && playingBlockX > 180 && playingBlockX < 210) { playingBlockXMovement = 1; playingBlockYMovement = 1; } ellipse(playingBlockX, playingBlockY, 20, 20); /////////////////////////// //Panel toggle switches// /////////////////////////// //Room light rectMode(CENTER); stroke(0); strokeWeight(1); fill(150); if (roomLight == true) { toggleLocation = 330; } else if (roomLight == false) { toggleLocation = 370; } rect(toggleLocation, 170, 10, 25); //Game Mode if (gameMode == true) { toggleLocation = 330; } else if (gameMode == false) { toggleLocation = 370; } rect(toggleLocation, 280, 10, 25); //Rave Mode if (raveMode == true ) { toggleLocation = 330; //delay(100); } else if (raveMode == false) { toggleLocation = 370; //delay(100); } rect(toggleLocation, 330, 10, 25); //Board Colours - RED if (mouseX >315 && mouseX < 338 && mouseY > 215 && mouseY < 245 && mousePressed) { redToggle = mouseY; } redToggleValue = (-1 * (redToggle - 245)) * 8.5; fill(redToggleValue, 0, 0); rect(320, redToggle, 20, 5); //Board Colours - GREEN if (mouseX >338 && mouseX < 361 && mouseY > 215 && mouseY < 245 && mousePressed) { greenToggle = mouseY; } greenToggleValue = (-1 * (greenToggle - 245)) * 8.5; fill(0, greenToggleValue, 0); rect(350, greenToggle, 20, 5); //Board Colours - BLUE if (mouseX >361 && mouseX < 400 && mouseY > 215 && mouseY < 245 && mousePressed) { blueToggle = mouseY; } blueToggleValue = (-1 * (blueToggle - 245)) * 8.5; fill(0, 0, blueToggleValue); rect(380, blueToggle, 20, 5); /////////////// //Board Glass// /////////////// rectMode(CORNERS); fill(200, 200, 255, 100); rect(90, 50, 225, 285, 20); } ////////////////////////////////////////////////// ////////////////////Layer Four//////////////////// ////////////////////////////////////////////////// void layerFour() { noStroke(); //Rave spot lights if (raveMode == true) { radiantLight(200 + 100 * sin(frameCount * 0.2), 50, 50, 200 + 100 * sin(frameCount * 0.5), 200 + 100 * cos(frameCount * 0.5), 50 + 50 * sin(frameCount), 50 + 50 * cos(frameCount), 10, 20); radiantLight(50, 200 + 100 * cos(frameCount * 0.2), 50, 200 + 100 * cos(frameCount * 0.5), 200 + 100 * sin(frameCount * 0.5), 50 + 50 * cos(frameCount), 50 + 50 * sin(frameCount), 10, 20); radiantLight(50, 50, 200 + 100 * sin(frameCount * 0.2), 200 + 100 * sin(frameCount * 0.5), 200 + 100 * tan(frameCount * 0.5), 50 + 50 * cos(frameCount), 50 + 50 * cos(frameCount), 10, 20); } //Low light ambience if (roomLight == false && raveMode == false) { roomAmbience(100, 100, 255); } //Rave mode ambience if (raveMode == true) { if (raveModeFlag == false) { redToggle = 245; greenToggle = 245; blueToggle = 245; raveModeFlag = true; } red = redToggleValue; green = greenToggleValue; blue = blueToggleValue; if (millis() % 3000 <= 1000) { red = 100 + red; } else if (millis() % 3000 <= 2000 && millis() % 3000 > 1000) { green = 100 + green; } else if (millis() % 3000 > 2000) { blue = 100 + blue; } roomAmbience(red, green, blue); } if (raveMode == false) { raveModeFlag = false; } } ///////////////////////////////////////////////// ////////////////////Functions//////////////////// ///////////////////////////////////////////////// ///////////////// //Room ambience// ///////////////// void roomAmbience(float red, float green, float blue) { rectMode(CENTER); noStroke(); fill(red, green, blue, 50); rect(200, 200, 400, 400); } ///////////////// //Radiant Light// ///////////////// void radiantLight(float red, float green, float blue, float locX, float locY, float lightWidth, float lightLength, float size, int rayWidth) { int i = 0; while (i<size) { fill(red, green, blue, 30-i); ellipse(locX, locY, lightWidth+rayWidth*i, lightLength+rayWidth*i); i++; } } //referenced from collect_a_thon //http://www-acad.sheridanc.on.ca/PROG14998/2017/interactive-toy/christopher_hewson_interactive_toy/index.html void keyPressed() { if ((key == 'W' || key =='w') && playingBlockWeight > -0.1 && playingBlockY < 300) { playingBlockWeight = playingBlockWeight - 0.1; } if ((key == 's' || key == 'S') && playingBlockWeight < 0.4 && playingBlockY < 300) { playingBlockWeight = playingBlockWeight + 0.1; } if ((key == 'a' || key == 'A') && playingBlockY < 300 && gameMode == false) { playingBlockXMovement = playingBlockXMovement - 1; } if ((key == 'd' || key == 'D') && playingBlockY < 300 && gameMode == false) { playingBlockXMovement = playingBlockXMovement + 1; } if (key == 'r' || key == 'R') { playingBlockX = 162.5; playingBlockY = 50; playingBlockYMovement = 0; playingBlockXMovement = 0; playModeRestartFlag = false; } }