Platina:Archive

디지털아트 프로그래밍[편집]

중간 과제[편집]

PImage bg, sia, imageGradient, dimpleImage, eyelidImage, lip;
PFont Helvetica75, Helvetica93, AppleSDGothicNeoB, AppleSDGothicNeoB20;
boolean doubleEyelid=false, dimple=false; // 쌍꺼풀, 보조개
boolean mouseClicked=false, keyRefreshed=false, draw_face=false;
color skinColor=#FAD2AC; // 피부색
int selectRL=1, selectUD=1; // 좌우 선택, 상하 선택

void setup() {
  size(540, 960);
  
  bg = loadImage("Gradient.png");
  sia = loadImage("sia_digitalart_50.png");
  imageGradient = loadImage("image_gradient.png");
  dimpleImage = loadImage("dimple.png");
  eyelidImage = loadImage("doubled_eyelid.png");
  lip = loadImage("lip.png");
  
  Helvetica75 = createFont("Helvetica Bold.ttf", 10);
  Helvetica93 = createFont("Helvetica Extended Black.ttf", 48);
  AppleSDGothicNeoB = createFont("AppleSDGothicNeoB.ttf", 25);
  AppleSDGothicNeoB20 = createFont("AppleSDGothicNeoB.ttf", 20);
  
  image(bg, 0, 0, 540, 960);
  userInterface();
}

void draw() {
  
  if(keyRefreshed) { // 방향키 누르는 효과 지속
    image(bg, 0, 0, 540, 960);
    userInterface();
    keyRefreshed = false;
  }
  
  if(selectRL==1 && selectUD==1) {
    fill(#FFFFFF);
    beginShape();
    vertex(127.2, 735.9);
    vertex(120, 730.9);
    vertex(111.5, 730.9);
    vertex(111.5, 740.9);
    vertex(119.9, 740.9);
    endShape(CLOSE);
  }
  else if(selectRL==1 && selectUD==2) {
    fill(#FFFFFF);
    beginShape();
    vertex(127.2, 762.2);
    vertex(120, 757.2);
    vertex(111.5, 757.3);
    vertex(111.5, 767.2);
    vertex(119.9, 767.2);
    endShape(CLOSE);
  }
  else if(selectRL==2 && selectUD==1) {
    fill(#FFFFFF);
    beginShape();
    vertex(285.4, 735.9);
    vertex(278.2, 730.9);
    vertex(269.8, 730.9);
    vertex(269.8, 740.9);
    vertex(278.2, 740.9);
    endShape(CLOSE);
  }
  else if(selectRL==2 && selectUD==2) {
    fill(#FFFFFF);
    beginShape();
    vertex(285.4, 762.2);
    vertex(278.2, 757.2);
    vertex(269.8, 757.2);
    vertex(269.8, 767.2);
    vertex(278.2, 767.2);
    endShape(CLOSE);
  }
  else if(selectRL==3 && selectUD==1) {
    fill(#FFFFFF);
    beginShape();
    vertex(443, 735.7);
    vertex(435.8, 730.7);
    vertex(427.3, 730.8);
    vertex(427.3, 740.7);
    vertex(435.8, 740.7);
    endShape(CLOSE);
  }
  else if(selectRL==3 && selectUD==2) {
    fill(#FFFFFF);
    beginShape();
    vertex(443, 762.2);
    vertex(435.8, 757.2);
    vertex(427.3, 757.2);
    vertex(427.3, 767.2);
    vertex(435.8, 767.2);
    endShape(CLOSE);
  }
  
  if(draw_face==true) {
    drawFace();
  }
  
  debug();
}

void mousePressed() {
  if(mouseX>=91 && mouseX<=120 && mouseY>=820 && mouseY<=865) { // UP
    fill(#4188F1);
    beginShape(); // UP (91.7, 820.8 ~ 120.2, 865.5)
    vertex(105.9, 865.5);
    vertex(91.7, 844.8);
    vertex(91.7, 820.8);
    vertex(120.2, 820.8);
    vertex(120.2, 844.8);
    endShape(CLOSE);
    mouseClicked=true;
  }
  
  if(mouseX>91 && mouseX<120 && mouseY>885 && mouseY<930) { // DOWN
    fill(#4188F1);
    beginShape(); // DOWN (91.7, 885.5 ~ 120.2, 930.3)
    vertex(105.7, 885.5);
    vertex(120.1, 906.3);
    vertex(120.2, 930.3);
    vertex(91.7, 930.3);
    vertex(91.7, 906.3);
    endShape(CLOSE);
    mouseClicked=true;
  }
  
  if(mouseX>115 && mouseX<160 && mouseY>861 && mouseY<889) { // RIGHT
    fill(#4188F1);
    beginShape(); // RIGHT (115.9, 861.3 ~ 160.7, 889.8)
    vertex(115.9, 875.5);
    vertex(136.7, 861.3);
    vertex(160.7, 861.3);
    vertex(160.7, 889.7);
    vertex(136.6, 889.7);
    endShape(CLOSE);
    mouseClicked=true;
  }
  
  if(mouseX>51 && mouseX<95 && mouseY>861 && mouseY<889) { // LEFT
    fill(#4188F1);
    beginShape(); // LEFT (51.2, 861.3 ~ 95.9, 889.8)
    vertex(95.9, 875.3);
    vertex(75.2, 861.3);
    vertex(51.2, 861.3);
    vertex(51.2, 889.8);
    vertex(75.2, 889.8);
    endShape(CLOSE);
    mouseClicked=true;
  }
  
  if(mouseX>391 && mouseX<496 && mouseY>820 && mouseY<865) { // 선택
    textFont(AppleSDGothicNeoB);
    fill(#4188F1);
    quad(496.3, 820.8, 391.4, 820.8, 391.4, 865.5, 496.3, 865.5);
    fill(#000000);
    text("선택", 423.4, 854.3);
    mouseClicked=true;
  }
  
  if(mouseX>391 && mouseX<496 && mouseY>885 && mouseY<930) { // 초기화
    fill(#4188F1);
    quad(391.4, 885.5, 496.3, 885.5, 496.3, 930.2, 391.4, 930.2);
    fill(#000000);
    text("초기화", 412, 919);
    mouseClicked=true;
  }
  
  if(mouseX>269 && mouseX<374 && mouseY>820 && mouseY<930) { // 확정
    fill(#4188F1);
    quad(269.4, 820.8, 374.3, 820.8, 374.3, 930.2, 269.4, 930.2);
    fill(#000000);
    text("확정", 301.7, 887);
    mouseClicked=true;
  }
}

void mouseReleased() {
  if(mouseClicked) {
    if(mouseX>=91 && mouseX<=120 && mouseY>=820 && mouseY<=865) { // UP
      fill(#FFFFFF);
      beginShape(); // UP (91.7, 820.8 ~ 120.2, 865.5)
      vertex(105.9, 865.5);
      vertex(91.7, 844.8);
      vertex(91.7, 820.8);
      vertex(120.2, 820.8);
      vertex(120.2, 844.8);
      endShape(CLOSE);
      if(selectUD>1) { // 방향키가 아래일 때
        selectUD--; // 위로 올림
      }
      else if(selectUD==1) { // 방향키가 위일 때
        if(selectRL==1) { // 방향키가 왼쪽 위일 때
          selectRL = 3; // 방향키를 맨 오른쪽으로 이동
          selectUD = 2; // 방향키를 맨 아래로 이동
        }
        else if(selectRL>1 && selectRL<=3) { // 방향키가 맨 왼쪽이 아닐 때
          selectRL--; // 방향키를 한 칸 왼쪽으로 이동
          selectUD = 2; // 방향키를 아래로 내림
        }
      }
      draw_face = false;
    }
    
    if(mouseX>91 && mouseX<120 && mouseY>885 && mouseY<930) { // DOWN
      fill(#FFFFFF);
      beginShape(); // DOWN (91.7, 885.5 ~ 120.2, 930.3)
      vertex(105.7, 885.5);
      vertex(120.1, 906.3);
      vertex(120.2, 930.3);
      vertex(91.7, 930.3);
      vertex(91.7, 906.3);
      endShape(CLOSE);
      if(selectUD<2) { // 방향키가 위일 때 
        selectUD++; // 아래로 내림
      }
      else if(selectUD==2) { // 방향키가 아래일 때
        if(selectRL==3) { // 방향키가 오른쪽 아래일 때
          selectUD = 1; // 방향키를 맨 위로 이동
          selectRL = 1; // 방향키를 맨 왼쪽으로 이동
        }
        else if(selectRL<3 && selectRL>=1) { // 방향키가 맨 오른쪽이 아닐 때
          selectUD = 1; // 방향키를 맨 위로 이동
          selectRL++; // 방향키를 한 칸 오른쪽으로 이동
        }
      }
      draw_face = false;
    }
    
    if(mouseX>115 && mouseX<160 && mouseY>861 && mouseY<889) { // RIGHT
      fill(#FFFFFF);
      beginShape(); // RIGHT (115.9, 861.3 ~ 160.7, 889.8)
      vertex(115.9, 875.5);
      vertex(136.7, 861.3);
      vertex(160.7, 861.3);
      vertex(160.7, 889.7);
      vertex(136.6, 889.7);
      endShape(CLOSE);
      if(selectRL>=1 && selectRL<3) { // 방향키가 맨 오른쪽이 아닐 경우
        selectRL++; // 방향키를 한 칸 오른쪽으로 이동
      }
      else if(selectRL==3) { // 방향키가 맨 오른쪽일 경우
        selectRL = 1; // 방향키를 맨 왼쪽으로 이동
      }
      draw_face = false;
    }
    if(mouseX>51 && mouseX<95 && mouseY>861 && mouseY<889) { // LEFT
      fill(#FFFFFF);
      beginShape(); // LEFT (51.2, 861.3 ~ 95.9, 889.8)
      vertex(95.9, 875.3);
      vertex(75.2, 861.3);
      vertex(51.2, 861.3);
      vertex(51.2, 889.8);
      vertex(75.2, 889.8);
      endShape(CLOSE);
      if(selectRL>1 && selectRL<=3) { // 방향키가 맨 왼쪽이 아닐 경우
        selectRL--; // 방향키를 한 칸 왼쪽으로 이동
      }
      else if(selectRL==1) { // 방향키가 맨 왼쪽일 경우
        selectRL = 3; // 방향키를 맨 오른쪽으로 이동
      }
    }
    draw_face = false;
  }
  
  if(mouseX>391 && mouseX<496 && mouseY>820 && mouseY<865) { // 선택
    textFont(AppleSDGothicNeoB);
    fill(#FFFFFF);
    quad(496.3, 820.8, 391.4, 820.8, 391.4, 865.5, 496.3, 865.5);
    fill(#000000);
    text("선택", 423.4, 854.3);
    
    if(selectRL==1 && selectUD==1) { // 쌍꺼풀 있음
      doubleEyelid = true;
    }
    else if(selectRL==1 && selectUD==2) { // 쌍꺼풀 없음
      doubleEyelid = false;
    }
    
    if(selectRL==2 && selectUD==1) { // 보조개 있음
      dimple = true;
    }
    else if(selectRL==2 && selectUD==2) { // 보조개 없음
      dimple = false;
    }
    
    if(selectRL==3 && selectUD==1) { // 피부색 밝음
      skinColor = #FAD2AC;
    }
    else if(selectRL==3 && selectUD==2) { // 피부색 어두음
      skinColor = #DCA676;
    }
    draw_face = false;
  }
  
  if(mouseX>391 && mouseX<496 && mouseY>885 && mouseY<930) { // 초기화
    fill(#FFFFFF);
    quad(391.4, 885.5, 496.3, 885.5, 496.3, 930.2, 391.4, 930.2);
    fill(#000000);
    text("초기화", 412, 919);
    
    doubleEyelid = false;
    dimple = false;
    skinColor = #FAD2AC;
    selectRL = 1;
    selectUD = 1;
    draw_face = false;
  }
  
  if(mouseX>269 && mouseX<374 && mouseY>820 && mouseY<930) { // 확정
    fill(#FFFFFF);
    quad(269.4, 820.8, 374.3, 820.8, 374.3, 930.2, 269.4, 930.2);
    fill(#000000);
    text("확정", 301.7, 887);
    draw_face = true;
  }
  mouseClicked = false;
  keyRefreshed = true;
}

void keyPressed() {
  if(key=='s') {
    saveFrame("screenshot/result-###.jpg");
    println("Screenshot Saved!");
  }
}

void makeEye() {
  if(doubleEyelid) {
    image(eyelidImage, 0, 0);
  }
  
  fill(#FFFFFF);
  ellipse(270-55, 428, 50, 25);
  ellipse(270+55, 428, 50, 25);
  fill(#000000);
  ellipse(270-55, 428, 25, 25);
  ellipse(270+55, 428, 25, 25);
}

void makeDimple() {
  image(dimpleImage, 0, 0);
}

void drawFace() {
  ellipseMode(CENTER);
  noStroke();
  
  rectMode(CORNER);
  if(skinColor==#FAD2AC) {
    fill(#964B00);
  }
  else {
    fill(#000000);
  }
  rect(141, 403, 257, 260); // HAIR_BACK 141, 403 ~ 398, 403
  
  fill(skinColor);
  rectMode(CENTER);
  rect(270, 600, 60, 200); // NECK
  ellipse(270, 428, 240, 320); // HEAD  
  
  if(skinColor==#FAD2AC) {
    fill(#964B00);
  }
  else {
    fill(#000000);
  }
  arc(270, 380, 260, 280, radians(170), radians(370), PIE); // HAIR
  
  fill(#4188F1);
  beginShape();
  vertex(240, 613);
  vertex(230, 613);
  vertex(49, 670);
  vertex(45, 709);
  vertex(494, 709);
  vertex(490, 670);
  vertex(310, 613);
  vertex(300, 613);
  endShape(CLOSE);
  
  fill(skinColor);
  arc(270, 613, 80, 80, radians(0), radians(180), PIE); // NECK_SHIRTS
  makeEye();
  if(dimple) {
    makeDimple();
  }
  image(lip, 0, 0);
}

void userInterface() {
  image(sia, 60, -41);
  
  fill(#FFFFFF);
  textFont(Helvetica93);
  text("DIGITAL ARTS", 48, 81.2);
  
  textFont(AppleSDGothicNeoB);
  text("증명사진 제작", 196.9, 113.2);
  
  image(imageGradient, 0, 0);
  fill(0, 0, 0, 0);
  stroke(#FFFFFF);
  strokeWeight(3);
  quad(43.7, 145.1, 43.7, 710.9, 496.3, 710.9, 496.3, 145.1);
  strokeWeight(0);
  
  fill(#FFFFFF);
  textFont(AppleSDGothicNeoB);
  text("쌍꺼풀", 43.7, 759.5);
  textFont(AppleSDGothicNeoB20);
  text("있음", 131, 745);
  text("없음", 131, 771);
  
  textFont(AppleSDGothicNeoB);
  text("보조개", 203.7, 759.5);
  textFont(AppleSDGothicNeoB20);
  text("있음", 289.3, 745);
  text("없음", 289.3, 771);
  
  textFont(AppleSDGothicNeoB);
  text("피부색", 360.8, 759.5);
  textFont(AppleSDGothicNeoB20);
  text("밝게", 446.7, 744.7);
  text("어둡게", 446.7, 771.1);
  
  beginShape(); // UP (91.7, 820.8 ~ 120.2, 865.5)
  vertex(105.9, 865.5);
  vertex(91.7, 844.8);
  vertex(91.7, 820.8);
  vertex(120.2, 820.8);
  vertex(120.2, 844.8);
  endShape(CLOSE);
  
  beginShape(); // DOWN (91.7, 885.5 ~ 120.2, 930.3)
  vertex(105.7, 885.5);
  vertex(120.1, 906.3);
  vertex(120.2, 930.3);
  vertex(91.7, 930.3);
  vertex(91.7, 906.3);
  endShape(CLOSE);
  
  beginShape(); // RIGHT (115.9, 861.3 ~ 160.7, 889.8)
  vertex(115.9, 875.5);
  vertex(136.7, 861.3);
  vertex(160.7, 861.3);
  vertex(160.7, 889.7);
  vertex(136.6, 889.7);
  endShape(CLOSE);
  
  beginShape(); // LEFT (51.2, 861.3 ~ 95.9, 889.8)
  vertex(95.9, 875.3);
  vertex(75.2, 861.3);
  vertex(51.2, 861.3);
  vertex(51.2, 889.8);
  vertex(75.2, 889.8);
  endShape(CLOSE);
  
  textFont(AppleSDGothicNeoB);
  fill(#FFFFFF);
  quad(496.3, 820.8, 391.4, 820.8, 391.4, 865.5, 496.3, 865.5); // 선택
  fill(#000000);
  text("선택", 423.4, 854.3);
  fill(#FFFFFF);
  quad(391.4, 885.5, 496.3, 885.5, 496.3, 930.2, 391.4, 930.2); // 초기화
  fill(#000000);
  text("초기화", 412, 919);
  fill(#FFFFFF);
  quad(269.4, 820.8, 374.3, 820.8, 374.3, 930.2, 269.4, 930.2); // 확정
  fill(#000000);
  text("확정", 301.7, 887);
}

void debug() {
  if(doubleEyelid) {
    print("Eyelid: double, ");
  }
  else {
    print("Eyelid: Single, ");
  }
  
  if(dimple) {
    print("Dimple: O, ");
  }
  else {
    print("Dimple: X, ");
  }
  
  if(skinColor==#FAD2AC) {
    print("Skin Color: Bright, ");
  }
  else {
    print("Skin Color: Dark, ");
  }
  
  print("Cursor Position X: ");
  print(mouseX);
  print(", Cursor Position Y: ");
  println(mouseY);
}