Lab3 - Song



void setup() {
  size(580, 580);
  smooth();
  strokeWeight(3);
  frameRate(60);
  background(255);
  scope();
}

void draw() {
  fill(255);
  ellipse(width/2, height/2, width*3/4, height*3/4);
  text_bodyslam(0, 2);
  crow(0, 2);
  Cloud();
  tear();
}

void text_bodyslam(float textX, float textY) {

  float RT=width/16;   //ratio text
  textFont(createFont("Tahoma", 38));
  String t = "Body Slam";
  fill(0);
  text(t, (RT)*5.5+RT*textX, (RT)*13+RT*textY);
}

void crow(float PositionX, float PositionY) {
  float RC=width/16; //ratio crow
  stroke(0);
  fill(0);

  //body//
  line(RC*6.5+RC*PositionX, RC*5+RC*PositionY, RC*6.65+RC*PositionX, RC*5.5+RC*PositionY);
  bezier(RC*9+RC*PositionX, RC*3.01+RC*PositionY, RC*8+RC*PositionX, RC*2.5+RC*PositionY,
    RC*7+RC*PositionX, RC*3+RC*PositionY, RC*6.5+RC*PositionX, RC*5.01+RC*PositionY);
  bezier(RC*6.65+RC*PositionX, RC*5.5+RC*PositionY, RC*6+RC*PositionX, RC*6+RC*PositionY,
    RC*5.75+RC*PositionX, RC*7+RC*PositionY, RC*5.75+RC*PositionX, RC*7.5+RC*PositionY);
  line(RC*5.75+RC*PositionX, RC*7.5+RC*PositionY, RC*6+RC*PositionX, RC*7.25+RC*PositionY);
  bezier(RC*6+RC*PositionX, RC*7.25+RC*PositionY, RC*6+RC*PositionX, RC*8+RC*PositionY,
    RC*6.8+RC*PositionX, RC*8.6+RC*PositionY, RC*7+RC*PositionX, RC*9+RC*PositionY);


  //pen//
  line(RC*9.0+RC*PositionX, RC*3.0+RC*PositionY, RC*10.0+RC*PositionX, RC*3.1+RC*PositionY);
  bezier(RC*10+RC*PositionX, RC*3.1+RC*PositionY, RC*9.5+RC*PositionX, RC*3.25+RC*PositionY,
    RC*9.15+RC*PositionX, RC*3.15+RC*PositionY, RC*9+RC*PositionX, RC*3.5+RC*PositionY);
  bezier(RC*9+RC*PositionX, RC*3.5+RC*PositionY, RC*9.2+RC*PositionX, RC*3.4+RC*PositionY,
    RC*9.5+RC*PositionX, RC*3.45+RC*PositionY, RC*10+RC*PositionX, RC*3.55+RC*PositionY);
  noFill();
  bezier(RC*10+RC*PositionX, RC*3.55+RC*PositionY, RC*9.25+RC*PositionX, RC*3.7+RC*PositionY,
    RC*8.8+RC*PositionX, RC*4.35+RC*PositionY, RC*8.8+RC*PositionX, RC*5.25+RC*PositionY);
  fill(0);
  bezier(RC*8.8+RC*PositionX, RC*5.25+RC*PositionY, RC*10.2+RC*PositionX, RC*6.75+RC*PositionY,
    RC*10.1+RC*PositionX, RC*8+RC*PositionY, RC*10+RC*PositionX, RC*9+RC*PositionY);

  //tail//
  beginShape();
  vertex(RC*10+RC*PositionX, RC*9+RC*PositionY);
  vertex(RC*11.25+RC*PositionX, RC*10.75+RC*PositionY);
  vertex(RC*10.75+RC*PositionX, RC*10.5+RC*PositionY);
  vertex(RC*10.95+RC*PositionX, RC*10.8+RC*PositionY);
  vertex(RC*10.25+RC*PositionX, RC*10.5+RC*PositionY);
  vertex(RC*10.35+RC*PositionX, RC*10.75+RC*PositionY);
  vertex(RC*9.3+RC*PositionX, RC*9.8+RC*PositionY);

  endShape();


  //leg//
  beginShape();
  vertex(RC*7+RC*PositionX, RC*9+RC*PositionY);
  vertex(RC*7.5+RC*PositionX, RC*10+RC*PositionY);
  vertex(RC*7+RC*PositionX, RC*11.1+RC*PositionY);
  vertex(RC*7.3+RC*PositionX, RC*11.1+RC*PositionY);
  vertex(RC*8+RC*PositionX, RC*10+RC*PositionY);
  vertex(RC*7.8+RC*PositionX, RC*9.5+RC*PositionY);
  vertex(RC*8.7+RC*PositionX, RC*10.2+RC*PositionY);
  vertex(RC*8.5+RC*PositionX, RC*11.1+RC*PositionY);
  vertex(RC*8.8+RC*PositionX, RC*11.1+RC*PositionY);
  vertex(RC*9.3+RC*PositionX, RC*9.8+RC*PositionY);


  endShape();
  strokeWeight(3);
  beginShape();
  vertex(RC*6.5+RC*PositionX, RC*5+RC*PositionY);
  vertex(RC*6.65+RC*PositionX, RC*5.5+RC*PositionY);
  vertex(RC*5.75+RC*PositionX, RC*7.5+RC*PositionY);
  vertex(RC*6+RC*PositionX, RC*7.25+RC*PositionY);
  vertex(RC*7+RC*PositionX, RC*9+RC*PositionY);
  vertex(RC*9.3+RC*PositionX, RC*9.8+RC*PositionY);
  vertex(RC*10+RC*PositionX, RC*9+RC*PositionY);
  vertex(RC*8.8+RC*PositionX, RC*5.25+RC*PositionY);

  vertex(RC*9+RC*PositionX, RC*3.5+RC*PositionY);
  vertex(RC*10+RC*PositionX, RC*3.1+RC*PositionY);
  vertex(RC*9.0+RC*PositionX, RC*3.0+RC*PositionY);

  endShape();

  beginShape();
  vertex(RC*8.8+RC*PositionX, RC*5.25+RC*PositionY);
  bezierVertex(RC*8.8+RC*PositionX, RC*4.35+RC*PositionY, RC*9.25+RC*PositionX, RC*3.7+RC*PositionY,
    RC*10+RC*PositionX, RC*3.55+RC*PositionY);
  vertex(RC*9+RC*PositionX, RC*3.5+RC*PositionY);
  endShape();

  ellipse(RC*7.8+RC*PositionX, RC*11.1+RC*PositionY, 130, 10);
}
void Cloud() {
  noStroke();
  fill(#828282);
  beginShape();
  vertex(width*14/16, height*2.5/16);
  curveVertex(width*16/16, height*2.5/16);
  curveVertex(width*13/16, height*1/16);
  curveVertex(width*12/16, height*1/16);
  curveVertex(width*10/16, height*2/16);
  curveVertex(width*9/16, height*1.5/16);
  curveVertex(width*7/16, height*1/16);
  curveVertex(width*6/16, height*2/16);
  curveVertex(width*4.5/16, height*1.5/16);
  curveVertex(width*2.5/16, height*2.5/16);
  curveVertex(width*3.5/16, height*4.0/16);
  curveVertex(width*6/16, height*4.5/16);
  curveVertex(width*7.5/16, height*4/16);
  curveVertex(width*10/16, height*4/16);
  curveVertex(width*12/16, height*3.5/16);
  curveVertex(width*14/16, height*3/16);
  curveVertex(width*14/16, height*2.5/16);
  endShape();
}
void scope() {
  //ratio scope
  int Color=0;
  for (float pos=width*2; pos>width*3/4; pos--) {
    stroke(0);
    if (pos<=width*5/4) {
      stroke(Color, Color, Color);
      Color++;
    }
    noFill();
    ellipse(width/2, height/2, pos, pos);
  }
}
float fallY=0, bigger=0, taller=0;
boolean rain_on=false;
void tear() {
  if (mouseButton == LEFT)rain_on=true;
  else if (mouseButton == RIGHT)rain_on=false;
  if (rain_on) {
    bigger+=0.1;
    taller+=0.2;
    fallY+=3;

    float Yfalling=height*5.5/16+fallY;
    float TBigger=width*5/580+bigger;
    if (Yfalling>=height*13.5/16) {
      taller=1;
      Yfalling=height*13.5/16;
    }
    if (TBigger>width*30/580)TBigger=width*30/580;

    noStroke();
    fill(#87CEFF);
    ellipse(width*8.5/16, Yfalling, TBigger, height*5/580+taller);
  } else if (!rain_on) {
    bigger=0;
    taller=0;
    fallY=0;
  }
}