2025年5月8日 星期四

week12

作業1:

//week12_1_guamdan_head_body_push_upuparm_uparm_hand

//改自week09-2、09-5

//將week09-5模型加進來

//再把week09-5左邊的一堆push trt pop 貼到後面,執行時mouse亂轉

PShape body,head;

PShape uparm1, upuparm1, hand1;

//week09-5複製來的

void setup(){

  size(400,400,P3D);

  body =loadShape("body.obj");

  head = loadShape("head.obj");

  //week09-5複製來的

  uparm1 = loadShape("uparm1.obj");

  upuparm1 = loadShape("upuparm1.obj");

  hand1 = loadShape("hand1.obj");

}


void draw(){

  background(204);

  translate(200,300);

  sphere(10); //球當原點


  scale(10,-10.10); //上下反過來

  shape(body,0,0);

  pushMatrix();

    translate(0,22,5);

    //rotate(radians(mouseX-200));

    rotateY(radians(mouseX-200));

    rotateX(radians(mouseY-60));

    translate(0,-22,5);

    shape(head,0,0);

  popMatrix();

  pushMatrix();//左邊手臂

    shape(upuparm1, 0, 0); // 上上手臂

    pushMatrix();

      translate(-4.1, 19.9); // 再掛回去原本的位置

      rotateZ(radians(mouseX));

      translate(4.1, -19.9); // 把物體的旋轉中心, 放到座標中心

      shape(uparm1, 0, 0); // 上手臂

      pushMatrix();

        translate(-4.5, +16.9);

        rotateX(radians(mouseY));

        translate(4.5, -16.9); // 剛剛把手移到座標中心的移動量

        //translate(mouseX/10.0, -mouseY/10.0); // 一邊移動、一邊找到數值

        //println(mouseX/10.0, -mouseY/10.0); // 印出適合的數值 ex. 4.5, -16.9

        shape(hand1, 0, 0);

      popMatrix();

    popMatrix();

  popMatrix();

}

作業2:

//week12_2_guamdan_head_body_push_upuparm_uparm_hand_angle

//改自week12-1

//要加上float[] angleX=new float[10];

//要加上float[] angleY=new float[10];

PShape body,head;

PShape uparm1, upuparm1, hand1;

//week09-5複製來的

void setup(){

  size(400,400,P3D);

  body =loadShape("body.obj");

  head = loadShape("head.obj");

  //week09-5複製來的

  uparm1 = loadShape("uparm1.obj");

  upuparm1 = loadShape("upuparm1.obj");

  hand1 = loadShape("hand1.obj");

}

float [] angleX=new float[10];

float [] angleY=new float[10];

int ID=0; //0:頭1:上上手臂2:上手臂3:手

void mouseDragged(){

    angleX[ID] +=radians(mouseX-pmouseX); //左右拖曳

    angleY[ID] +=radians(mouseY-pmouseY); //上下拖曳

}

void draw(){

  background(204);

  translate(200,300);

  sphere(10); //球當原點


  scale(10,-10.10); //上下反過來

  

  shape(body,0,0);

  pushMatrix();

    translate(0,22,5);

    //rotate(radians(mouseX-200));

    rotateY(angleX[0]); //X方向左右拖曳,是對Y軸旋轉

    rotateX(angleY[0]);//Y方向上下拖曳,是對X軸旋轉

    translate(0,-22,5);

    shape(head,0,0);

  popMatrix();

  

  pushMatrix();//左邊手臂

    shape(upuparm1, 0, 0); // 上上手臂

    pushMatrix();

      translate(-4.1, 19.9); // 再掛回去原本的位置

      //rotateZ(radians(mouseX));

      rotateZ(angleY[2]);

      rotateY(angleX[2]);

      translate(4.1, -19.9); // 把物體的旋轉中心, 放到座標中心

      shape(uparm1, 0, 0); // 上手臂

      pushMatrix();

        translate(-4.5, +16.9);

        //rotateX(radians(mouseY));

        rotateX(angleY[3]);

        rotateY(angleX[3]);

        translate(4.5, -16.9); // 剛剛把手移到座標中心的移動量

        //translate(mouseX/10.0, -mouseY/10.0); // 一邊移動、一邊找到數值

        //println(mouseX/10.0, -mouseY/10.0); // 印出適合的數值 ex. 4.5, -16.9

        shape(hand1, 0, 0);

      popMatrix();

    popMatrix();

  popMatrix();

}

作業3:

// week11_3_postman_again

// 重新來一次, 讓程式的架構變更清楚

PImage postman, head, body, uparm1, hand1, uparm2, hand2, foot1, foot2;

void setup(){ // 把上面的圖, 都拉近新專案裡

  size(560, 560);

  postman = loadImage("postman.png");

  head = loadImage("head.png");

  body = loadImage("body.png");

  uparm1 = loadImage("uparm1.png");

  uparm2 = loadImage("uparm2.png");

  hand1 = loadImage("hand1.png");

  hand2 = loadImage("hand2.png");

  foot1 = loadImage("foot1.png"); // 增加腳 旋轉中心 220,375

  foot2 = loadImage("foot2.png"); // 增加腳 旋轉中心 260,372

}

float [] angleX = new float[10]; // 在 3D 的世界裡, 我們的旋轉

float [] angleY = new float[10];

int ID = 0; // 一開始是頭的關節

ArrayList<String> lines = new ArrayList<String>();

void keyPressed(){

  if(key=='s'){ // 現在動作的所有關節,都存起來

    String now = ""; // 空字串

    for(int i=0; i<10; i++){

      now += angleX[i] + " "; // 後面有空格

      now += angleY[i] + " "; // 後面有空格

    }

    lines.add(now); // 把現在的動作的這行, 加到 lines 裡

    String [] arr = new String[lines.size()];

    lines.toArray(arr);

    saveStrings("angles.txt", arr);

    println("現在存檔:" + now);

  }

  if(key=='r'){

    String [] file = loadStrings("angles.txt");

    if(file != null){

      for(int i=0; i<file.length; i++){

        lines.add(file[i]);

        println("現在讀檔:" + file[i]);

      }

    }

  }

  if(key=='p') playing = !playing; // 播動畫 <=> 不播動畫

  

  if(key=='1') ID = 1; // 左邊臂

  if(key=='2') ID = 2; // 左邊手

  if(key=='3') ID = 3; // 右邊臂

  if(key=='4') ID = 4; // 右邊手

  if(key=='5') ID = 5; // 左邊腳

  if(key=='6') ID = 6; // 右邊腳

  if(key=='0') ID = 0; // 頭

}

boolean playing = false; // 一開始,不播放動畫, 按下 'p'可切換

void mouseDragged(){

  angleX[ID] += mouseX - pmouseX;

  angleY[ID] += mouseY - pmouseY; // 多了這一行

}

int R = 0;

void myInterpolate(){ // 請不要剪貼, 老師重寫

  if(lines.size()>=2){ // 要有2行以上, 才能做內插

    float alpha = (frameCount%30)/30.0; // 介於 0.0~1.0中間的值

    if(alpha==0.0) R = (R+1)%lines.size(); // 如果變到0.0就換下一組

    int R2 = (R+1)%lines.size();

    float [] oldAngle = float(split( lines.get( R ), ' '));

    float [] newAngle = float(split( lines.get( R2 ), ' '));

    for(int i=0; i<10; i++){

      angleX[i] = oldAngle[i*2+0]*(1-alpha) + newAngle[i*2+0]*alpha;

      angleY[i] = oldAngle[i*2+1]*(1-alpha) + newAngle[i*2+1]*alpha;

    }

  }

}

void draw(){

  background(#FFFFF2);

  if(playing) myInterpolate();

  image(body, 0, 0); // 先畫身體

  

  pushMatrix();

    translate(+236, +231); // 再放回去正確的位置

    rotate(radians(angleX[0]));

    translate(-236, -231); // 把頭的旋轉中心, 放到(0,0)

    image(head, 0, 0); // 再畫頭

  popMatrix();


  pushMatrix(); // 腳 foot1

    translate(220, 375);

    rotate(radians(angleX[5]));

    translate(-220, -375);

    image(foot1, 0, 0);

  popMatrix();


  pushMatrix(); // 腳 foot2

    translate(260, 372);

    rotate(radians(angleX[6]));

    translate(-260, -372);

    image(foot2, 0, 0);

  popMatrix();

  

  pushMatrix(); // 要畫左邊的上手臂、手肘

    translate(+185, +261);

    rotate(radians(angleX[1]));

    translate(-185, -261);

    image(uparm1, 0, 0); // 上手臂

    pushMatrix();

      translate(+116, +265);

      rotate(radians(angleX[2]));

      translate(-116, -265);

      image(hand1, 0, 0); // 手肘

    popMatrix();

  popMatrix();  

  

  pushMatrix(); // 要畫右邊的上手臂、手肘

    translate(290, 262);

    rotate(radians(angleX[3]));

    translate(-290, -262);

    image(uparm2, 0, 0);

    pushMatrix();

      translate(357, 259);

      rotate(radians(angleX[4]));

      translate(-357, -259);

      image(hand2, 0, 0);

    popMatrix();

  popMatrix();

}

作業4:

//week12_4_guamdan_left_push_pop_keyPressed_id

//改自week12-2


PShape body,head;

PShape uparm1, upuparm1, hand1;

//week09-5複製來的

void setup(){

  size(400,400,P3D);

  body =loadShape("body.obj");

  head = loadShape("head.obj");

  //week09-5複製來的

  uparm1 = loadShape("uparm1.obj");

  upuparm1 = loadShape("upuparm1.obj");

  hand1 = loadShape("hand1.obj");

}

float [] angleX=new float[10];

float [] angleY=new float[10];

int ID=0; //0:頭1:上上手臂2:上手臂3:手

void mouseDragged(){

    angleX[ID] +=radians(mouseX-pmouseX); //左右拖曳

    angleY[ID] +=radians(mouseY-pmouseY); //上下拖曳

}

void keyPressed(){ //小心會變成ㄅ,便注音

  if(key=='1') ID=1;//還沒設好上上手臂

  if(key=='2') ID=2;//ok上手臂

  if(key=='3') ID=3;//ok手

  if(key=='4') ID=4;

  if(key=='5') ID=5;

  if(key=='6') ID=6;

  if(key=='7') ID=7;

  if(key=='8') ID=8;

  if(key=='9') ID=9;

  if(key=='0') ID=0;//頭

}

void draw(){

  background(204);

  translate(200,300);

  sphere(10); //球當原點


  scale(10,-10.10); //上下反過來

  

  shape(body,0,0);

  pushMatrix();

    translate(0,22,5);

    //rotate(radians(mouseX-200));

    rotateY(angleX[0]); //X方向左右拖曳,是對Y軸旋轉

    rotateX(angleY[0]);//Y方向上下拖曳,是對X軸旋轉

    translate(0,-22,5);

    shape(head,0,0);

  popMatrix();

  

  pushMatrix();//左邊手臂

    translate(-2.9,20.8);

    rotateX(angleX[1]);

    rotateY(angleY[1]);

    translate(2.9,-20.8);

    //println(mouseX/10.0,-mouseY/10.0);

    shape(upuparm1, 0, 0); // 上上手臂

    pushMatrix();

      translate(-4.1, 19.9); // 再掛回去原本的位置

      //rotateZ(radians(mouseX));

      rotateZ(angleY[2]);

      rotateY(angleX[2]);

      translate(4.1, -19.9); // 把物體的旋轉中心, 放到座標中心

      shape(uparm1, 0, 0); // 上手臂

      pushMatrix();

        translate(-4.5, +16.9);

        //rotateX(radians(mouseY));

        rotateX(angleY[3]);

        rotateY(angleX[3]);

        translate(4.5, -16.9); // 剛剛把手移到座標中心的移動量

        //translate(mouseX/10.0, -mouseY/10.0); // 一邊移動、一邊找到數值

        //println(mouseX/10.0, -mouseY/10.0); // 印出適合的數值 ex. 4.5, -16.9

        shape(hand1, 0, 0);

      popMatrix();

    popMatrix();

  popMatrix();

}

作業5:

//week12_5_guamdan_left_push_pop_keyPressed_id

//改自week12-4

//PShape 宣告要複製也要複製loadShape改成2

//void setup()也要改成2

//void draw() 也複製「trt」右邊變成2,X正負相反

PShape body,head;

PShape uparm1, upuparm1, hand1;

PShape uparm2, upuparm2, hand2;


//week09-5複製來的

void setup(){

  size(400,400,P3D);

  body =loadShape("body.obj");

  head = loadShape("head.obj");

  //week09-5複製來的

  uparm1 = loadShape("uparm1.obj");

  upuparm1 = loadShape("upuparm1.obj");

  hand1 = loadShape("hand1.obj");

  //week12-4

  uparm2 = loadShape("uparm2.obj");

  upuparm2 = loadShape("upuparm2.obj");

  hand2 = loadShape("hand2.obj");

}

float [] angleX=new float[10];

float [] angleY=new float[10];

int ID=0; //0:頭1:上上手臂2:上手臂3:手

void mouseDragged(){

    angleX[ID] +=radians(mouseX-pmouseX); //左右拖曳

    angleY[ID] +=radians(mouseY-pmouseY); //上下拖曳

}

void keyPressed(){ //小心會變成ㄅ,便注音

  if(key=='1') ID=1;//還沒設好上上手臂

  if(key=='2') ID=2;//ok上手臂

  if(key=='3') ID=3;//ok手

  if(key=='4') ID=4;

  if(key=='5') ID=5;

  if(key=='6') ID=6;

  if(key=='7') ID=7;

  if(key=='8') ID=8;

  if(key=='9') ID=9;

  if(key=='0') ID=0;//頭

}

void draw(){

  background(204);

  translate(200,300);

  sphere(10); //球當原點


  scale(10,-10.10); //上下反過來

  

  shape(body,0,0);

  pushMatrix();

    translate(0,22,5);

    //rotate(radians(mouseX-200));

    rotateY(angleX[0]); //X方向左右拖曳,是對Y軸旋轉

    rotateX(angleY[0]);//Y方向上下拖曳,是對X軸旋轉

    translate(0,-22,5);

    shape(head,0,0);

  popMatrix();

  

  pushMatrix();//左邊手臂

    translate(-2.9,20.8);

    rotateX(angleX[1]);

    rotateY(angleY[1]);

    translate(2.9,-20.8);

    //println(mouseX/10.0,-mouseY/10.0);

    shape(upuparm1, 0, 0); // 上上手臂

    pushMatrix();

      translate(-4.1, 19.9); // 再掛回去原本的位置

      //rotateZ(radians(mouseX));

      rotateZ(angleY[2]);

      rotateY(angleX[2]);

      translate(4.1, -19.9); // 把物體的旋轉中心, 放到座標中心

      shape(uparm1, 0, 0); // 上手臂

      pushMatrix();

        translate(-4.5, +16.9);

        //rotateX(radians(mouseY));

        rotateX(angleY[3]);

        rotateY(angleX[3]);

        translate(4.5, -16.9); // 剛剛把手移到座標中心的移動量

        //translate(mouseX/10.0, -mouseY/10.0); // 一邊移動、一邊找到數值

        //println(mouseX/10.0, -mouseY/10.0); // 印出適合的數值 ex. 4.5, -16.9

        shape(hand1, 0, 0);

      popMatrix();

    popMatrix();

  popMatrix();

  

    pushMatrix();//右邊手臂

    translate(2.9,20.8);

    rotateX(angleX[4]);

    rotateY(angleY[4]);

    translate(-2.9,-20.8);

    //println(mouseX/10.0,-mouseY/10.0);

    shape(upuparm2, 0, 0); // 上上手臂

    pushMatrix();

      translate(4.1, 19.9); // 再掛回去原本的位置

      //rotateZ(radians(mouseX));

      rotateZ(angleY[5]);

      rotateY(angleX[5]);

      translate(-4.1, -19.9); // 把物體的旋轉中心, 放到座標中心

      shape(uparm2, 0, 0); // 上手臂

      pushMatrix();

        translate(+4.5, 16.9);

        //rotateX(radians(mouseY));

        rotateX(angleY[6]);

        rotateY(angleX[6]);

        translate(-4.5, -16.9); // 剛剛把手移到座標中心的移動量

        //translate(mouseX/10.0, -mouseY/10.0); // 一邊移動、一邊找到數值

        //println(mouseX/10.0, -mouseY/10.0); // 印出適合的數值 ex. 4.5, -16.9

        shape(hand2, 0, 0);

      popMatrix();

    popMatrix();

  popMatrix();

}



作業6:

//week12-6_sound

//要有聲音,需要聲音的Library 函式庫

//Sketch-Library-Managed Libraries

//會看到 Sound | Provides a simple way to work with audio

//選他,下載

//下載完會有file-Examples點開核心函式庫

//Soundfile 點Sampleplayback

import processing.sound.*;

SoundFile mySound; //超範例,改變數名

void setup(){

  size(400,400);

  mySound=new SoundFile(this,"music.mp3"); //改黨名

  mySound.play();//播放

}

void draw(){


}

作業7:

//week12-7_sound_intro_sword_monkey

import processing.sound.*;

SoundFile sndInGame,sndIntro,sndMonkey,sndSword;

void setup(){

  size(400,400);

  sndInGame=new SoundFile(this,"In Game Music.mp3");

  sndIntro=new SoundFile(this,"Intro Song_Final.mp3");

  sndMonkey=new SoundFile(this,"Monkey 1.mp3"); 

  sndSword=new SoundFile(this,"sword slash.mp3"); 

}

boolean playIntro=true;

void keyPressed(){

  if(playIntro){

    sndIntro.stop();

    sndInGame.play();

    playIntro=false;

  }else{

    sndInGame.stop();

    sndIntro.play();

    playIntro=true;

  }

}

void mousePressed(){

  if(mouseButton==LEFT) sndSword.play();

  if(mouseButton==RIGHT) sndMonkey.play();

}

void draw(){//一定要加才會更新程式50fps

}

沒有留言:

張貼留言