Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
/* Introduction to Media Computation: Interactive Drawing Assignment

    09/2018
    By Roberto Rosales
    
"Be the Spartan"
  Pretty simple interactions, you hold an MA5C Assault Rifle that moves with the mouse to a certain degree.
  Click on the mouse to shoot, press a key to get hit. Don't worry, your shields will regenerate automatically.
  PS. Those Covenant ships are too far away to shoot, but you can always try.
*/

void setup() {
  // Set the size of window & remove cursor
  size (400, 400);
  noCursor();
}

 void draw() {
   // Set framerate to 60
   frameRate(60);
// BACKGROUND STUFF
   // Make background green (pretty irrelevant because we'll just draw gradients over it)
  background(80, 230, 170);
  
  // Start drawing the background gradients
  // 1st, bottom, darkest
  noStroke();
  fill(70, 192, 144);
  rectMode(CENTER);
  rect(200, 240, 400, 30);
  // 2nd
  fill(70, 200, 150);
  rect(200, 210, 400, 30);
  // 3rd
  fill(74, 212, 155);
  rect(200, 180, 400, 30);
  // 4th
  fill(84, 225, 170);
  rect(200, 150, 400, 30);
  // 5th
  fill(88, 234, 178);
  rect(200, 120, 400, 30);
  // 6th
  fill (96, 244, 186);
  rect(200, 90, 400, 30);
  // 7th
  fill(140, 245, 198);
  rect(200, 60, 400, 30);
  // 8th, top, lightest
  fill(180, 248, 222);
  rect(200, 20, 400, 50);
 
  
  
// COVENANT FLEET STUFF
  // Covenant Assault Carrier (Biggest ship)
  fill(110, 100, 105);
  // Main structure
  ellipse(501 - (frameCount % 1000), 49, 60, 40);
  ellipse(495 - (frameCount % 1000), 50, 65, 40);
  ellipse(526 - (frameCount % 1000), 42, 21, 20);
  // Deck
  ellipse(520 - (frameCount % 1000), 67, 70, 6);
  // Bridge
  ellipse(550 - (frameCount % 1000), 35, 140, 11);
  // Mid section
  ellipse(600 - (frameCount % 1000), 45, 65, 25);
  ellipse(588 - (frameCount % 1000), 55, 60, 6);
  // Fire
  fill(100, 210, 255);
  ellipseMode(CORNER);
  ellipse(628 - (frameCount % 1000), 45, random(685-655), 10);
  // Tail
  fill(120, 95, 115);
  ellipseMode(CENTER);
  ellipse(635 - (frameCount % 1000), 40, 30, 10);
  
  // Covenant Battlecruisers (smaller ships)
  // Main structure
  fill(120, 95, 115);
  ellipseMode(CENTER);
  ellipse(402 - (frameCount % 1000), 100, 15, 10);
  // Bridge
  ellipse(420 - (frameCount % 1000), 97, 40, 5);
  // Mid Section
  ellipse(435 - (frameCount % 1000), 101, 35, 12);
  // Tail
  ellipse(451 - (frameCount % 1000), 99, 15, 5);
  // "Teeth"
  triangle(396 - (frameCount % 1000), 100, 402 - (frameCount % 1000), 110, 401 - (frameCount % 1000), 100);
  triangle(400 - (frameCount % 1000), 100, 406 - (frameCount % 1000), 108, 408 - (frameCount % 1000), 100);
  // Fire
  fill(100, 210, 255);
  ellipseMode(CORNER);
  ellipse(452 - (frameCount % 1000), 100, random(468-456), 5);
  
  
  
// TREES & STUFF
  // Left tree
  fill(40, 40, 20);
    // Main trunk
  //  left bot/right bot/right top/left top 
  quad(50, 400, 140, 400, 130, 0, 70, 0);
    // Secondary trunk(?)
  //      left bot  /  top   / right bot
  triangle(-30, 238, 40, 170, 80, 238);
  //  left bot/right bot/right top/left top
  quad(15, 238, 55, 238, 35, 0, 15, 0);
  
  // Right tree
    // Main trunk
  //      ( left bot /  top    / right bot)
  triangle(340, 238, 320, -150, 430, 238);
  triangle(300, 250, 400, 90, 400, 238);
    // Branches
  //  left bot / left top/right top/right bot
  quad(340, 150, 290, 100, 315, 96, 340, 115);
  triangle(290, 100, 280, -150, 315, 97);
  
  
  
// CLOUDS STUFF
  /* Clouds
  Honestly I just messed randomly with the cos and sin functions until I got a result I liked */
  fill(0, 0, 0, 100);
  ellipseMode(CENTER);
  ellipse(320 + cos(frameCount/50.0)*10, 260 + sin(frameCount/150.0)*10, 300, 100);
  ellipse(49 + sin(frameCount/50.0)*10, 250 + cos(frameCount/150.0)*10, 248, 150);
  fill(20, 20, 20, 60);
  ellipse(180 + sin(frameCount/50.0)*10, 300 + sin(frameCount/100.0)*10, 140, 200);
  ellipse(360 + cos(frameCount/50.0), 300 + cos(frameCount/100.0)*10, 220, 220);

  
  
// FLOOR & WALL STUFF
 // Draw background floor
 noStroke();
 fill(150, 150, 150);
 rectMode(CORNERS);
 rect(0, 300, 400, 400);

 // Draw first background structure
 fill(180);
 rect(0, 252, 400, 300);
 // Floor/wall line-shadow
 stroke(40);
 strokeWeight(2);
 line(0, 300, 400, 300);

// Draw secondary structures, "bumps"
// Bump 1
  noStroke();
  fill(200);
  rect(0, 238, 100, 300);
// Bump1 shadow
  fill(100);
  rect(100, 252, 104, 300);
// Bump 2
  noStroke();
  fill(200);
  rect(300, 238, 400, 300);
// Bump2 shadow
  fill(100);
  rect(300, 252, 296, 300);



// ASSAULT RIFLE & ARM STUFF
  // Palm 
  noStroke();
  fill(20);
  // (        Left bottom          /          Right bottom       /            Left top        /          Right top          )
 quad(mouseX/20+290, mouseY/15+335, mouseX/20+330, mouseY/15+355, mouseX/20+360, mouseY/15+315, mouseX/20+315, mouseY/15+295);

  // Receiver top
  fill(140);
  // (          Right top        /          Left top          /        Left bottom         /          Right bottom      )
 quad(mouseX/20+295, mouseY/9+222, mouseX/20+275, mouseY/7+225, mouseX/20+262, mouseY/7+250, mouseX/20+280, mouseY/8+260);
     // Green led
     stroke(100, 255, 100);
     strokeWeight(3);
     line(mouseX/20+280, mouseY/7+248, mouseX/20+282, mouseY/7+243);

  // Receiver bottom
  noStroke();
  fill(70);
  //  (        Left top           /         Left bottom         /           Right bottom      /      Right top           )
  quad(mouseX/20+262, mouseY/7+250, mouseX/20+275, mouseY/8+300, mouseX/20+295, mouseY/8+305, mouseX/20+280, mouseY/8+260);

  // Barrel top 
  fill(130);
  //   (        Left top            /          Right top         /          Right bottom        /      Left bottom  )
  quad(mouseX/20+280, mouseY/8+260, mouseX/20+340, mouseY/11+268, mouseX/20+400, mouseY/40+305, mouseX/20+400, 340);
  stroke(140);
  line(mouseX/20+280, mouseY/8+260, mouseX/20+400, 340);

  // Barrel bottom 
  fill(130);
  //  (          Left top          /    Right top     /    Right bottom    /        Left bottom        )  
  quad(mouseX/20+280, mouseY/8+259, mouseX/20+400, 340, mouseX/20+400, 380, mouseX/20+285, mouseY/8+299);
  strokeWeight(13);{
  stroke(70);}
  line(mouseX/20+280, mouseY/8+292, mouseX/20+325, mouseY/12+322);
  
  // Stock
  fill(80);
  //      (          Bottom left       /         Top       /    Bottom right   )
  triangle(mouseX/20+380, mouseY/25+317, mouseX/20+410, 305, mouseX/20+410, 340);
  
  // Ammo Counter base
  noStroke();
  fill(140);
  //   (          Left  top        /          Rigt top          /          Right bottom      /      Left bottom          )
  quad(mouseX/20+295, mouseY/9+222, mouseX/20+325, mouseY/10+224,mouseX/20+340, mouseY/11+268, mouseX/20+280, mouseY/8+260);

  // Ammo counter screen
  strokeWeight(2);
  stroke(110);
  fill(120, 140, 160);
  //   (          Left  top         /          Rigt top           /          Right bottom       /      Left bottom          )
  quad(mouseX/20+300, mouseY/8+224, mouseX/20+320, mouseY/9+227, mouseX/20+330, mouseY/10+260, mouseX/20+290, mouseY/8+255);
  // Flickering screen
  fill(120, 160, 190, tan(frameCount)*100);
  quad(mouseX/20+300, mouseY/8+224, mouseX/20+320, mouseY/9+227, mouseX/20+330, mouseY/10+260, mouseX/20+290, mouseY/8+255);
    // Bullet counter display
  noFill();
  stroke(74, 255, 253, tan(frameCount)*1000);
  strokeWeight(1);
    // (        Left bottom         /          Right top         /          Right bottom         /          Left top         )
  quad(mouseX/20+300, mouseY/9+245, mouseX/20+318, mouseY/9+235, mouseX/20+320, mouseY/9+245, mouseX/20+302, mouseY/8.8+235);

  // Hand & Arm
  // Thumb
  noStroke();
  fill(30);
  //  (        Right top           /        Right bottom          /          Left bottom       /          Left top           )
  quad(mouseX/20+300, mouseY/15+305, mouseX/20+310, mouseY/15+335, mouseX/20+290, mouseY/15+335, mouseX/20+290, mouseY/15+295);
  
  // Basic forearm
  fill(20);
  //  (          Left top          /            Right top         /          Right bottom       /         Left bottom        )
  quad(mouseX/20+290, mouseY/15+335, mouseX/20+330, mouseY/15+355, mouseX/20+310, mouseY/15+395, mouseX/20+255, mouseY/15+395);
  // Forearm armor
  fill(60, 80, 150);
  //  (          Left top          /            Right top         /           Right bottom      /        Left bottom         )
  quad(mouseX/20+280, mouseY/15+340, mouseX/20+330, mouseY/15+375, mouseX/20+322, mouseY/15+405, mouseX/20+240, mouseY/15+405);

  // Forearm armor shadow
  fill(40, 40, 40, 200);
  //  (          Left top          /            Right top        /          Right  bottom       /          Left bottom       )
  quad(mouseX/20+296, mouseY/15+352, mouseX/20+310, mouseY/15+360, mouseX/20+295, mouseY/15+405, mouseX/20+270, mouseY/15+405);


// HUD STUFF
  // Top blue edge
  stroke(74, 255, 253, 160);
  strokeWeight(2);
  fill(74, 255, 253, 30);
  ellipse(width/2, -15, 500, 100);

  // Bottom blue edge
    // Center
  noStroke();
  fill(74, 255, 253, 30);
  rectMode(CENTER);
  rect(width/2, 395, 330, 20);
    // Right corner
  fill(74, 255, 253, 30);
  quad(365, 385, 500, 270, 500, 400, 365, 410);
    // Left corner
  fill(74, 255, 253, 30);
  quad(35, 385, -100, 270, -100, 400, 35, 410);
    // Outline
  stroke(74, 255, 253, 160);
  line(-100, 270, 35, 385);
  line(35, 385, 365, 385);
  line(365, 385, 500, 270);

  // Shield's bar
  stroke(74, 255, 253, 160);
  fill(74, 255, 253, 60);
  rect(width/2, 20, 100, 10);
  // Outline
  stroke(255, 255, 255, 100);
  rect(200, 20, 105, 15);

  // Radar
    // Basic shape
  stroke(74, 255, 253, 140);
  fill(74, 255, 253, 60);
  ellipseMode(CENTER);
  ellipse(50, 340, 90, 70);
    // Center dot
  noStroke();
  fill(255, 255, 255, 220);
  ellipse(50, 340, 4, 2);
    // Enemy movement (red dots)
  noStroke();
  fill(240, 0, 0, 160);
  ellipse(70 + cos(frameCount/40.0)*10, 340 + sin(frameCount/25.0)*5, 4, 2);
  fill(240, 0, 0, 160);
  ellipse(20 + sin(frameCount/25.0)*10, 335 + cos(frameCount/50.0)*5, 4, 2);

  // Crosshair
  noFill();
  stroke(74, 255, 255);
  strokeWeight(2);
  ellipseMode(CENTER);
  ellipse(mouseX, mouseY, 20, 20);
  line(mouseX+10,mouseY,mouseX+5,mouseY);
  line(mouseX-10,mouseY,mouseX-5,mouseY);
  line(mouseX,mouseY+10,mouseX,mouseY+5);
  line(mouseX,mouseY-10,mouseX,mouseY-5);
 }


// SHOOTING STUFF
void mousePressed() { 
  println("Pew");
  
  // Firing lines
   stroke(255, 255, 70);
  strokeWeight(3);
  line(mouseX, mouseY, mouseX/20+262, mouseY/7+250);
  line(mouseX/20+262, mouseY/7+250, mouseX-random(15-5), mouseY-random(16-7));
  line(mouseX/20+262, mouseY/7+250, mouseX+random(15-5), mouseY+random(18-9));
 }
 
 
 
// When key is pressed you get hit and shields regenerate
 void keyPressed() {
  println("AAHHHHH");
  frameRate(3);
  
  // Shield taking damage
  fill(255, 70, 70, 200);
  rect(200, 20, 100, 10);
  
  // Red stuff from getting shot
  noStroke();
  ellipse(-275, height/2, 600, 1000);
  ellipse(675, height/2, 600, 1000);
  
  // This is just the previous seen "Bottom blue edge" of "HUD STUFF", but in red
  rect(200, 395, 330, 20);
  // Right corner
  quad(365, 385, 500, 270, 500, 400, 365, 410);
  // Left corner
  quad(35, 385, -100, 270, -100, 400, 35, 410);
  // Outline
  stroke(74, 255, 253, 160);
  line(-100, 270, 35, 385);
  line(35, 385, 365, 385);
  line(365, 385, 500, 270);
   
 }