/* Spookem's Mansion by James Pratt Assignment#2: Interactive Toy My interactive toy stars a cute ghost named Spookem and a little dude named Little Dude (duh). You control an invisible Spookem with your mouse. Clicking causes him to go visible. Little Dude will walk back and forth and turn around when he reaches an edge of the screen. If he spots Spookem in front of him, he'll get scared and stop moving. All the while theres a storm outside, and lighting will randomly flash outside. */ // VARIABLES \\ //guy variables float guyX; //where Little Dude is horizontally float guyY; //where Little Dude is vertically (doesn't change but makes it a solid point of reference) int speed = 2; //how fast Dude goes across the screen float guyEye; //detirmines where the far eye goes boolean guyScared; //detirmines if Dude is scared or not int directionFacing; //sets the direction Little Dude is facing, 1 = right, 0 = left //Spookem variables float spookemsOpacity = 0; //makes spookems invisible intially float tailOffset= 10; //distance between all of Spookems tail pieces boolean spookemsVisible = false; //sets spookems visiblity to false so Little Dude can't see him. When it's true, Dude can see him if he's facing him //Environment variable int windowLightning; //Changes the color of the window to white when lightingChance is called boolean leftEdge; //left edge of the screen boolean rightEdge; //left edge of the screen // SETUP \\ void setup() { frameRate(60); size(800, 600); smooth(); rectMode(CORNERS); ellipseMode(CENTER); //Set Guy's positon on the screen guyX=0; guyY=height/2; } //EXECUTION\\ //Conditionals set whether or not Little Dude is facing left or right based on the last edge he hit. void draw() { if (guyX==width) { rightEdge=true; leftEdge=false; } else if (guyX==0) { leftEdge=true; rightEdge=false; } //If Little Dude is facing Spookem, Spookem is in front of Little Dude and Spookem is visible, Dude will get scared and stop moving. Otherwise, he keeps moving //This is for when Dude is moving left from the right edge of the screen. if (rightEdge==true) { if ((spookemsVisible==true)&&(mouseX<guyX)&&(directionFacing==0)) { stopMoving(); guyScared=true; } else { moveLeft(); guyEye=guyX-20; guyScared=false; } //Same as above, but for moving right from the left edge. } else if (leftEdge==true) { if ((spookemsVisible==true)&&(mouseX>guyX)&&(directionFacing==1)) { stopMoving(); guyScared=true; } else { moveRight(); guyEye=guyX+20; guyScared=false; } } guyX+=speed; //guyX's postion adds 1 every frame noCursor(); spookemsOpacity= constrain(spookemsOpacity, 0, 200); //sets that spookems has a defined invisible state and visible state without constantly subtracing 100 from its opacity //makes SpookeguyX m visible when mouse is clicked if (mousePressed == true) { spookemsOpacity +=100; spookemsVisible = true; } else { spookemsOpacity -=100; spookemsVisible = false; } //makes lightning randomly flash in the window int lightningChance= int (random(10)); if (lightningChance==5) { windowLightning= 255; } else { windowLightning= 0; } //DISPLAY\\ // Clear Screen background(82, 73, 92); drawFloor(); drawWindow(); drawPortrait(); drawLittleGuy(); drawSpookems(); } void drawFloor() { //Draw floor\\ noStroke(); fill(107, 103, 76); rect(0, 500, 800, 600); } void drawSpookems() { //Spookem\\ //Draws Spookem's body noStroke(); fill(169, 219, 176, spookemsOpacity); rect(mouseX-30, mouseY-90, mouseX+30, mouseY); //Draw Spookem's head noStroke(); arc(mouseX, mouseY-90, 60, 60, PI, TWO_PI, OPEN); //Draw Spookem's face stroke(133, 158, 137); strokeWeight(2); line(mouseX-10, mouseY-90, mouseX-10, mouseY-70); line(mouseX+10, mouseY-90, mouseX+10, mouseY-70); arc(mouseX, mouseY-60, 10, 20, 0, PI); noStroke(); fill(247, 255, 248, spookemsOpacity); ellipse(mouseX-10, mouseY-60, 10, 5); ellipse(mouseX+10, mouseY-60, 10, 5); //Draw Spookem's tail for (int i =0; i < 6; i++) { noStroke(); fill(169, 219, 176, spookemsOpacity); ellipse(mouseX-25+i*tailOffset, mouseY, 10, 10); } } void drawWindow() { //Window\\ //draws frame fill(107, 103, 76); quad(60, 90, 270, 90, 230, 270, 100, 270); //draw window fill(windowLightning); stroke(0); strokeWeight(1); quad(80, 100, 250, 100, 220, 260, 110, 260); //draw window panes stroke(255); line(130, 100, 130, 260); line(200, 100, 200, 260); line(96, 190, 233, 190); } void drawPortrait() { //Portrait\\ //draw frame noStroke(); fill(209, 209, 73); rect(600, 200, 700, 320); //draw portrait background fill(129, 145, 116); rect(610, 210, 690, 310); //head fill(229, 237, 206); rect(630, 230, 660, 270); //nose ellipse(660, 250, 20, 10); //moustache fill(74, 77, 66); ellipse(655, 260, 20, 10); //eye stroke(0); strokeWeight(2); line(650, 240, 650, 250); //hat noStroke(); fill(74, 77, 66); rect(620, 230, 670, 240); rect(630, 215, 660, 230); //shirt quad(630, 270, 655, 270, 650, 310, 610, 310); //chin fill(229, 237, 206); ellipse(660, 270, 15, 10); } void drawLittleGuy() { //Little guy\\ //body fill (25, 85, 145); triangle(guyX, guyY+100, guyX-30, guyY+190, guyX+30, guyY+190); //head fill(232, 219, 195); ellipse(guyX, guyY+80, 60, 60); //eyes //If Dude is scared, then draw the scared face. Otherwise draw the neutral face. if (guyScared==true){ scaredFace(); } else{ fill(0); ellipse(guyX, guyY+75, 5, 10); ellipse(guyEye, guyY+75, 5, 10); } //shoes fill(46, 48, 44); ellipse(guyX-20, guyY+200, 30, 20); ellipse(guyX+20, guyY+200, 30, 20); } void moveRight() { speed=2; directionFacing=1; } void moveLeft() { speed=-2; directionFacing=0; } void stopMoving() { speed=0; } void scaredFace() { noStroke(); fill(255); ellipse(guyX, guyY+75,15,15); ellipse(guyEye, guyY+75,15,15); fill(0); ellipse(guyX,guyY+75,5,5); ellipse(guyEye,guyY+75,5,5); }