/////Pinata Time///// //<>//
/*
Oct 1st 2017
Intro to Media Computation
Instructor: Fredd Eyles
Created by: Charmaine Wong/ Ho Wing Wong
Keep hitting the pinata to make it explode out candy!
*/
//user defined variables for the candy backdrop
float candyX = random(0, 400);
float candyY = random(-200, 0);
float chocoX=random(0, 400);
float chocoY=random(-200, 0);
float cakeX=random(0, 400);
float cakeY=random(-200, 0);
//bat that replaces the cursor
float batX;
float batY;
//hit detection, the amount of times hit until the player wins
float pinataHealth=5000;
float damage=1000;
boolean candyDrop = false;
boolean win;
void setup() {
size(400, 400);
smooth();
frameRate(60);
candyY=10;
chocoY=10;
cakeY=10;
win = false;
}
void draw() {
//default background colour
frameRate(60);
background(248, 216, 231);
rectMode(CORNER);
drawCandy();
drawChoco();
drawCake();
updateCandy();
reset();
state();
if (pinataHealth>0) {
drawPinata();
}
drawBat();
}
//Candy
void drawCandy()
{
if (candyDrop == false) {
fill(140, 117, 159);
rect(candyX, candyY+60, 20, 20);
triangle(candyX, candyY+40, candyX+20, candyY+40, candyX+10, candyY+60);
triangle(candyX, candyY+100, candyX+10, candyY+80, candyX+20, candyY+100);
rect(candyX-270, candyY+80, 20, 20);
triangle(candyX-270, candyY+70, candyX-250, candyY+70, candyX-260, candyY+80);
triangle(candyX-270, candyY+110, candyX-250, candyY+110, candyX-260, candyY+100);
}
}
void drawChoco() {
if (candyDrop == false) {
rectMode(CENTER);
fill(197, 135, 174);
stroke(197, 135, 174);
triangle(chocoX, chocoY+70, chocoX+30, chocoY+70, chocoX+15, chocoY+85);
triangle(chocoX, chocoY+130, chocoX+15, chocoY+115, chocoX+30, chocoY+130);
rect(chocoX+15, chocoY+100, 13, 40);
}
}
void drawCake() {
{
if (candyDrop == false) {
ellipseMode(CENTER);
ellipse(cakeX+170, cakeY+250, 20, 25);
ellipse(cakeX-30, cakeY+330, 20, 25);
}
}
if (candyY>height) {
candyY=-30;
candyX = random(0, 400);
}
if (chocoY>height) {
chocoY=-30;
chocoX=random(0, 400);
}
if (cakeY>height) {
cakeY=-30;
cakeX=random(0, 400);
}
}
void updateCandy() {
//moving parts
candyY = candyY +1;
chocoY= chocoY+1;
cakeY= cakeY+2;
if ( pinataHealth<=0)
{
//chocoY=chocoY+4;
//candyY=candyY+4;
//cakeY=cakeY+4;
//removed since it didn't create an exciting explosion effect I wanted
chocoY=random(-20, 400);
chocoX= random(0, 400);
candyY=random(-20, 400);
candyX= random(0, 400);
cakeX=random(0, 400);
cakeY=random(-20, 400);
}
}
//random 'spawn' of the item in different areas
{
if (candyY>height)
{
candyX = random (0, 400);
candyY = random (-100, -10);
}
}
{
if (chocoY>height)
{
chocoX = random (0, 400);
chocoY = random (-100, -10);
}
if (cakeY>height)
{
cakeX = random (0, 400);
cakeY = random (-100, -10);
}
}
void drawPinata() {
//Original Pinata
//line connecting to pinata
strokeWeight(7);
line(160, 0, 160+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
//back ear
strokeWeight(1);
stroke(197, 135, 174);
fill(197, 135, 174);
quad(70+sin(frameCount/20.0)*30, 53+abs(cos(frameCount/20.0)*10), 80+sin(frameCount/20.0)*30, 50+abs(cos(frameCount/20.0)*10), 90+sin(frameCount/20.0)*30, 100+abs(cos(frameCount/20.0)*10), 70+sin(frameCount/20.0)*30, 120+abs(cos(frameCount/20.0)*10));
//back legs
//left leg
rectMode(CORNER);
rect(130+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10), 20, 30);
//right leg
rectMode (CORNER);
rect(190+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10), 20, 30);
//hooves
stroke(140, 117, 159);
fill(140, 117, 159);
rectMode(CORNER);
rect(130+sin(frameCount/20.0)*30, 270+abs(cos(frameCount/20.0)*10), 20, 10);
rect(105+sin(frameCount/20.0)*30, 280+abs(cos(frameCount/20.0)*10), 20, 10);
rect(195+sin(frameCount/20.0)*30, 270+abs(cos(frameCount/20.0)*10), 20, 10);
rect(215+sin(frameCount/20.0)*30, 280+abs(cos(frameCount/20.0)*10), 20, 10);
stroke(245, 184, 199);
fill(245, 184, 199);
beginShape();
vertex(90+sin(frameCount/20.0)*30, 30+abs(cos(frameCount/20.0)*10));
vertex(100+sin(frameCount/20.0)*30, 30+abs(cos(frameCount/20.0)*10));
vertex(130+sin(frameCount/20.0)*30, 120+abs(cos(frameCount/20.0)*10));
vertex(130+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
vertex(220+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
vertex(240+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10));
vertex(240+sin(frameCount/20.0)*30, 280+abs(cos(frameCount/20.0)*10));
vertex(210+sin(frameCount/20.0)*30, 280+abs(cos(frameCount/20.0)*10));
vertex(210+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10));
vertex(130+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10));
vertex(130+sin(frameCount/20.0)*30, 280+abs(cos(frameCount/20.0)*10));
vertex(100+sin(frameCount/20.0)*30, 280+abs(cos(frameCount/20.0)*10));
vertex(100+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 220+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
vertex(60+sin(frameCount/20.0)*30, 140+abs(cos(frameCount/20.0)*10));
vertex(60+sin(frameCount/20.0)*30, 120+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 100+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 30+abs(cos(frameCount/20.0)*10));
// etc;
endShape();
//eyes
fill(255);
strokeWeight(2);
stroke(123, 88, 153);
ellipseMode(CENTER);
ellipse(90+sin(frameCount/20.0)*30, 120+abs(cos(frameCount/20.0)*10), 15, 15);
//nose
noStroke();
fill(197, 135, 174);
quad(60+sin(frameCount/20.0)*30, 120+abs(cos(frameCount/20.0)*10), 70+sin(frameCount/20.0)*30, 113+abs(cos(frameCount/20.0)*10), 70+sin(frameCount/20.0)*30, 148+abs(cos(frameCount/20.0)*10), 60+sin(frameCount/20.0)*30, 140+abs(cos(frameCount/20.0)*10));
//nostrils
strokeWeight(2);
stroke(123, 88, 153);
line(65+sin(frameCount/20.0)*30, 125+abs(cos(frameCount/20.0)*10), 65+sin(frameCount/20.0)*30, 135+abs(cos(frameCount/20.0)*10));
// tails
noStroke();
stroke(253, 238, 199);
fill(253, 238, 199);
//first tail
quad(230+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10), 260+sin(frameCount/20.0)*30, 130+abs(cos(frameCount/20.0)*10), 260+sin(frameCount/20.0)*30, 150+abs(cos(frameCount/20.0)*10), 240+sin(frameCount/20.0)*30, 170);
quad(270+sin(frameCount/20.0)*30, 130+abs(cos(frameCount/20.0)*10), 300+sin(frameCount/20.0)*30, 145+abs(cos(frameCount/20.0)*10), 300+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10), 270+sin(frameCount/20.0)*30, 150+abs(cos(frameCount/20.0)*10));
//second tail
triangle(250+sin(frameCount/20.0)*30, 170+abs(cos(frameCount/20.0)*10), 270+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10), 270+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10));
triangle(280+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10), 310+sin(frameCount/20.0)*30, 190+abs(cos(frameCount/20.0)*10), 280+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10));
//third tail
triangle(255+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10), 265+sin(frameCount/20.0)*30, 210+abs(cos(frameCount/20.0)*10), 245+sin(frameCount/20.0)*30, 190);
triangle(270+sin(frameCount/20.0)*30, 190+abs(cos(frameCount/20.0)*10), 300+sin(frameCount/20.0)*30, 220+abs(cos(frameCount/20.0)*10), 275+sin(frameCount/20.0)*30, 210);
//dark pink body
stroke(240, 178, 215);
fill(240, 178, 215);
beginShape();
vertex(90+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
vertex(220+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
vertex(240+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10));
vertex(240+sin(frameCount/20.0)*30, 200+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 200+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
// etc;
endShape();
//purple body
stroke(203, 206, 255);
fill(203, 206, 255);
beginShape();
vertex(90+sin(frameCount/20.0)*30, 200+abs(cos(frameCount/20.0)*10));
vertex(240+sin(frameCount/20.0)*30, 200+abs(cos(frameCount/20.0)*10));
vertex(240+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10));
vertex(100+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 220+abs(cos(frameCount/20.0)*10));
vertex(90+sin(frameCount/20.0)*30, 200+abs(cos(frameCount/20.0)*10));
// etc;
endShape();
//details pinata
stroke(251, 205, 190);
fill(251, 205, 190);
quad(120+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10), 125+sin(frameCount/20.0)*30, 180+abs(cos(frameCount/20.0)*10), 130+sin(frameCount/20.0)*30, 190+abs(cos(frameCount/20.0)*10), 120+sin(frameCount/20.0)*30, 195+abs(cos(frameCount/20.0)*10));
triangle(180+sin(frameCount/20.0)*30, 195+abs(cos(frameCount/20.0)*10), 190+sin(frameCount/20.0)*30, 210+abs(cos(frameCount/20.0)*10), 180+sin(frameCount/20.0)*30, 210+abs(cos(frameCount/20.0)*10));
noStroke();
stroke(253, 238, 199);
fill(253, 238, 199);
quad(160+sin(frameCount/20.0)*30, 225+abs(cos(frameCount/20.0)*10), 165+sin(frameCount/20.0)*30, 225+abs(cos(frameCount/20.0)*10), 170+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10), 158+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10));
quad(105+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10), 120+sin(frameCount/20.0)*30, 260+abs(cos(frameCount/20.0)*10), 110+sin(frameCount/20.0)*30, 260+abs(cos(frameCount/20.0)*10), 104+sin(frameCount/20.0)*30, 250+abs(cos(frameCount/20.0)*10));
quad(220+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10), 224+sin(frameCount/20.0)*30, 240+abs(cos(frameCount/20.0)*10), 230+sin(frameCount/20.0)*30, 260+abs(cos(frameCount/20.0)*10), 220+sin(frameCount/20.0)*30, 260+abs(cos(frameCount/20.0)*10));
noStroke();
stroke(210, 172, 209);
fill(210, 172, 209);
quad(195+sin(frameCount/20.0)*30, 250+abs(cos(frameCount/20.0)*10), 200+sin(frameCount/20.0)*30, 250+abs(cos(frameCount/20.0)*10), 205+sin(frameCount/20.0)*30, 260+abs(cos(frameCount/20.0)*10), 195+sin(frameCount/20.0)*30, 260+abs(cos(frameCount/20.0)*10));
}
void drawBat() {
stroke(140, 117, 159);
fill(140, 117, 159);
rectMode(CENTER);
batX = mouseX;
batY = mouseY;
rect(batX, batY, 20, 80);
//hit dection for pinata
if (batX >=90 && batX<=240 && batY>=160 && batY<=240 && mousePressed) {
pinataHealth=pinataHealth-damage;
frameRate(1);
background(255, 105, 97);
//Line
fill(140, 117, 159);
strokeWeight(7);
line(160, 0, 160+sin(frameCount/20.0)*30, 160+abs(cos(frameCount/20.0)*10));
//
//back ears
strokeWeight(1);
stroke(197, 135, 174);
fill(197, 135, 174);
quad(70, 53, 80, 50, 90, 100, 70, 120);
//hooves
rectMode(CORNER);
rect(80, 270, 20, 10);
rect(183, 270, 20, 10);
rect(235, 270, 20, 10);
quad(120, 265, 135, 255, 140, 260, 125, 270);
//back legs
quad(100, 220, 130, 220, 105, 270, 75, 270);
quad(180, 220, 220, 220, 255, 270, 230, 270);
//teeth
fill(255);
stroke(253, 238, 199);
rectMode(CORNER);
rect(50, 140, 10, 10);
rect(40, 140, 10, 10);
//pinata body when pressed
stroke(245, 184, 199);
fill(245, 184, 199);
beginShape();
vertex(90, 30);
vertex(100, 30);
vertex(130, 120);
vertex(130, 160);
vertex(210, 160);
vertex(250, 190);
vertex(210, 270);
vertex(180, 270);
vertex(210, 220);
vertex(110, 220);
vertex(140, 250);
vertex(115, 270);
vertex(80, 225);
vertex(80, 160);
vertex(40, 160);
vertex(40, 150);
vertex(80, 150);
vertex(80, 140);
vertex(60, 140);
vertex(60, 125);
vertex(90, 100);
vertex(90, 30);
// etc;
endShape();
//nose
fill(188, 213, 243);
stroke(188, 213, 243);
quad(60, 125, 70, 117, 70, 140, 60, 140);
stroke(140, 117, 159);
line(65, 125, 65, 135);
//eyes
fill(140, 117, 159);
noStroke();
ellipseMode(CENTER);
ellipse(90, 120, 18, 18);
fill(247, 183, 183);
stroke(247, 183, 183);
rectMode(CORNER);
rect(80, 125, 20, 20);
//details of pinata
//pinata tail
fill(133, 213, 202);
stroke(133, 213, 202);
strokeWeight(2);
quad(225, 160, 240, 150, 250, 150, 240, 170);
rectMode(CORNER);
rect(240, 120, 10, 20);
triangle(240, 110, 240, 90, 250, 110);
quad(255, 150, 268, 150, 260, 180, 250, 170);
quad(260, 140, 270, 120, 280, 120, 270, 140);
triangle(255, 120, 260, 80, 265, 120);
triangle(270, 110, 285, 90, 280, 110);
triangle(280, 140, 300, 160, 270, 160);
//peach body
fill(251, 205, 190);
stroke(251, 205, 190);
strokeWeight(2);
quad(79, 161, 215, 160, 250, 190, 80, 190);
//blue body
fill(170, 224, 211);
stroke(170, 224, 211);
quad(80, 190, 250, 190, 235, 220, 80, 220);
//Pinata details
stroke(251, 205, 190);
fill(251, 205, 190);
quad(120, 180, 125, 180, 130, 190, 120, 195);
triangle(180, 195, 190, 210, 180, 210);
noStroke();
stroke(253, 238, 199);
fill(253, 238, 199);
quad(90, 130, 96, 130, 100, 140, 92, 145);
quad(105, 240, 120, 260, 110, 260, 104, 250);
quad(220, 240, 224, 240, 230, 260, 220, 260);
noStroke();
stroke(210, 172, 209);
fill(210, 172, 209);
quad(195, 250, 200, 250, 205, 260, 195, 260);
if (damage>=1000) {
damage=1000;
}
}
}
//determine win
void state() {
if (win==true) {
chocoY=random(-20, 400);
chocoX= random(0, 400);
candyY=random(-20, 400);
candyX= random(0, 400);
cakeX=random(0, 400);
cakeY=random(-20, 400);
}
}
//resetting program
void reset() {
if (keyPressed) {
pinataHealth=5000;
drawPinata();
win=false;
}
}