2020年1月2日 星期四

互動技術week17_期末作品_火柴人齊打交

 利用processing 寫出一個小格鬥遊戲,可以移動 攻擊。
我們利用makeruno 連接兩個搖桿可以控制我們的人物,前後左右,但最後拍影片介紹時,發現搖桿攻擊的按鈕好像有問題,但之前有與老師討論過後,有成功讓人物攻擊與發出聲音。
-----------------------------------------------------------------------------------------------------------------------------

processing端的程式碼

 import processing.sound.*;
import ddf.minim.*;
import processing.serial.*;
Serial serial;
int x, y, a, b, c, d;
Minim minim;
AudioPlayer player;

int countime=11880;
PImage imgloading, imgpressshift, imgpressnumlock;
PImage imgblackman, imgredman;
PImage imgblackmanwin, imgredmanwin;

float blackmanX=100, blackmanY=100, redmanX=1000, redmanY=100;
float blackmanVX=0, blackmanVY=0, redmanVX=0, redmanVY=0;
float blackbloodX=320, redbloodX=880;

//SoundFile soundfile1, soundfile2, soundfile3;
AudioPlayer soundfile1, soundfile2, soundfile3;
void setup() {
  serial = new Serial(this, "COM3", 19200);

  size(1200, 700);
  imgloading = loadImage("loading.png");
  imgpressshift = loadImage("pressshift.png");
  imgpressnumlock = loadImage("pressnumlock.png");
  imgblackman = loadImage("man1right.png");
  imgredman = loadImage("man2left.png");
  imgblackmanwin=loadImage("blackmanwin.png");
  imgredmanwin=loadImage("redmanwin.png");

  //soundfile2= new SoundFile (this, "punch.mp3");
  //soundfile3= new SoundFile (this, "kick1.wav");
  //soundfile3.play();
  minim = new Minim(this);
  soundfile2=minim.loadFile("punch.mp3");
  soundfile3=minim.loadFile("kick.mp3");
  //soundfile3.play();
}
void draw() {
  if (serial.available()>0) {
    String now=serial.readString();
    String[] xyab=splitTokens(now);
    x=1023-int (xyab[0]);
    y=1023-int (xyab[1]);
    a=1023-int (xyab[2]);
    b=1023-int (xyab[3]);
    c=int (xyab[4]);
    d=int (xyab[5]);
    if (x > 601) {
      blackmanVY = +4;
      bsoftBrakeY=0;
    }
    if (x < 401) {  
      blackmanVY = -4;
      bsoftBrakeY=0;
    }
    if (x < 601 && x > 401) { 
      bsoftBrakeY=1;
    }
    if (y > 606) {
      imgblackman = loadImage("man1left.png");
      blackmanVX=-4;
      bsoftBrakeX=0;
      blackmanstatus = 2;
    }
    if (y < 406) {
      imgblackman = loadImage("man1right.png");
      blackmanVX=4;
      bsoftBrakeX=0;
      blackmanstatus = 1;
    }
    if (y < 606 && x > 406) { 
      bsoftBrakeX=1;
    }
    if (a > 612) {
      redmanVY = 4;
      rsoftBrakeY=0;
    }
    if (a < 412) {
      redmanVY = -4;
      rsoftBrakeY=0;
    }
    if (a < 612 && a > 412) { 
      rsoftBrakeY=1;
    }
    if (b > 624) {
      imgredman = loadImage("man2left.png");
      redmanVX=-4;
      rsoftBrakeX=0;
      redmanstatus = 2;
    }
    if (b < 424) {
      imgredman = loadImage("man2right.png");
      redmanVX=4;
      rsoftBrakeX=0;
      redmanstatus = 1;
    }
    if (b < 624 && b > 424) { 
      rsoftBrakeX=1;
    }
    if (c<1023) { 
      if (blackmanstatus==1) {
        imgblackman = loadImage("man1right.png");
      }
      if (blackmanstatus==2) {
        imgblackman = loadImage("man1left.png");
      }
    }
    if (c==1023) {
      if (blackmanstatus == 1) {
        imgblackman = loadImage("blackmanattackright.png");
        if (blackmanX+100>redmanX+20 && blackmanX+100<redmanX+80 && blackmanY+50>redmanY+20 && blackmanY+50<redmanY+120) {
          redbloodX = redbloodX +10 ;
          soundfile2.rewind();
          soundfile2.play();
        }
      }
      if (blackmanstatus == 2) {
        imgblackman = loadImage("blackmanattackleft.png");
        if (blackmanX>redmanX+20 && blackmanX<redmanX+80 && blackmanY+50>redmanY+20 && blackmanY+50<redmanY+120) {
          redbloodX = redbloodX +10 ;
          soundfile2.rewind();
          soundfile2.play();
        }
      }
    }

    if (d<1023) {
      if (redmanstatus==1) {
        imgredman = loadImage("man2right.png");
      }
      if (redmanstatus==2) {
        imgredman = loadImage("man2left.png");
      }
    }
    if (d==1023) {
      if (redmanstatus==1) {
        imgredman = loadImage("redmanattackright.png");
        if (redmanX+100>blackmanX+20 && redmanX+100<blackmanX+80 && redmanY+50>blackmanY+20 && redmanY+50<blackmanY+120) {
          blackbloodX = blackbloodX-10 ;
          soundfile3.rewind();
          soundfile3.play();
        }
      }
      if (redmanstatus==2) {
        imgredman = loadImage("redmanattackleft.png");
        if (redmanX>blackmanX+20 && redmanX<blackmanX+80 && redmanY+50>blackmanY+20 && redmanY+50<blackmanY+120) {
          blackbloodX = blackbloodX-10 ;
          soundfile3.rewind();
          soundfile3.play();
        }
      }
    }
  }

  if (countime<60) background(#ED16B0);
  else {
    countime--;
  }

  if (countime/60 > 195) {
    image(imgloading, 0, 0, 1200, 700);
  }
  if (countime/60 <= 195 && countime/60 > 193) {
    image(imgpressshift, 0, 0, 1200, 700);
  }
  if (countime/60 <= 193 && countime/60 > 191) { 
    image(imgpressnumlock, 0, 0, 1200, 700);
  }

  if (countime/60 <= 191) {
    background(255); 

    fill(#4E1CE8);
    rect(0, 0, 1200, 20);
    rect(0, 20, 20, 700);
    rect(20, 650, 1200, 680);
    rect(1180, 20, 1200, 700);

    fill(#DDEA28);
    textSize(30);
    text("Time: "+int(countime/60), 530, 685); 

    fill(0);
    rect(20, 665, blackbloodX, 20);

    fill(#D6233B);
    rect(redbloodX, 665, 300, 20);

    image(imgblackman, blackmanX, blackmanY, 100, 140);
    image(imgredman, redmanX, redmanY, 100, 140);
  }

  if (blackmanX>20 && blackmanX<1080) {
    blackmanX += blackmanVX;
  } else if (blackmanX<=20) {
    blackmanX=blackmanX+5;
  } else if (blackmanX>=1080) {
    blackmanX=blackmanX-5;
  }
  if (blackmanY>20 && blackmanY<509) {
    blackmanY += blackmanVY;
  } else if (blackmanY<=20) {
    blackmanY=blackmanY+6;
  } else if (blackmanY>=509) {
    blackmanY=blackmanY-5;
  }
  if (redmanX>20 && redmanX<1080) {
    redmanX += redmanVX;
  } else if (redmanX<=20) {
    redmanX=redmanX+5;
  } else if (redmanX>=1080) {
    redmanX=redmanX-5;
  }
  if (redmanY>20 && redmanY<509) {
    redmanY += redmanVY;
  } else if (redmanY<=20) {
    redmanY=redmanY+5;
  } else if (redmanY>=509) {
    redmanY=redmanY-5;
  }

  if (bsoftBrakeX==1) { 
    blackmanVX *= 0.95;
  }
  if (bsoftBrakeY==1) { 
    blackmanVY *= 0.7;
  }
  if (rsoftBrakeX==1) { 
    redmanVX *= 0.95;
  }
  if (rsoftBrakeY==1) { 
    redmanVY *= 0.7;
  }

  if (blackbloodX<21) {
    image(imgredmanwin, 0, 0, 1200, 700);
  }
  if (redbloodX> 1179) {
    image(imgblackmanwin, 0, 0, 1200, 700);
  }

  if (countime/60 == 0) {
    if (blackbloodX-20 > 1180-redbloodX) {
      image(imgblackmanwin, 0, 0, 1200, 700);
    } else if (blackbloodX-20 < 1180-redbloodX) {
      image(imgredmanwin, 0, 0, 1200, 700);
    } else background(#ED16B0);
  }
}



int bsoftBrakeX=0, bsoftBrakeY=0;
int rsoftBrakeX=0, rsoftBrakeY=0;
void keyReleased() {

  if (keyCode==86)    bsoftBrakeX=1;
  if (keyCode==88)    bsoftBrakeX=1;
  if (keyCode==68)    bsoftBrakeY=1;
  if (keyCode==81) {
    if (blackmanstatus==1) {
      imgblackman = loadImage("man1right.png");
    }
    if (blackmanstatus==2) {
      imgblackman = loadImage("man1left.png");
    }
  }  

  if (key==51)   rsoftBrakeX=1;
  if (key==49)   rsoftBrakeX=1;
  if (key==53)   rsoftBrakeY=1;
  if (key==55) {
    if (redmanstatus==1) {
      imgredman = loadImage("man2right.png");
    }
    if (redmanstatus==2) {
      imgredman = loadImage("man2left.png");
    }
  }  
  //if(keyCode=='DOWN')  bsoftbrakeY=1;
  //if(keyCode==50)      rsoftBrakeY=1;
}


int blackmanstatus;
int redmanstatus;
void keyPressed() {
  if (keyCode==81) {
    if (blackmanstatus == 1) {
      imgblackman = loadImage("blackmanattackright.png");
      if (blackmanX+100>redmanX+20 && blackmanX+100<redmanX+80 && blackmanY+50>redmanY+20 && blackmanY+50<redmanY+120) {
        redbloodX = redbloodX +10 ;
        soundfile2.rewind();
        soundfile2.play();
      }
    }
    if (blackmanstatus == 2) {
      imgblackman = loadImage("blackmanattackleft.png");
      if (blackmanX>redmanX+20 && blackmanX<redmanX+80 && blackmanY+50>redmanY+20 && blackmanY+50<redmanY+120) {
        redbloodX = redbloodX +10 ;
        soundfile2.rewind();
        soundfile2.play();
      }
    }
  }

  if (keyCode==86) {                                                                            
    imgblackman = loadImage("man1right.png");
    blackmanVX=4;
    bsoftBrakeX=0;
    blackmanstatus = 1;
    //if(keyCode==81) {imgblackman = loadImage("blackmanattackright.png"); }
  }
  if (keyCode==88) {
    imgblackman = loadImage("man1left.png");
    blackmanVX=-4;
    bsoftBrakeX=0;
    blackmanstatus = 2;
  }
  if (keyCode==68) {
    blackmanVY = -4;
    bsoftBrakeY=0;
  }
  if (keyCode==67) {
    blackmanVY = 4;
    bsoftBrakeY=0;
  }

  if (key==51) {
    imgredman = loadImage("man2right.png");
    redmanVX=4;
    rsoftBrakeX=0;
    redmanstatus = 1;
  }
  if (key==49) {
    imgredman = loadImage("man2left.png");
    redmanVX=-4;
    rsoftBrakeX=0;
    redmanstatus = 2;
  }
  if (key==53) {
    redmanVY = -4;
    rsoftBrakeY=0;
  }
  if (key==50) {
    redmanVY = 4;
    rsoftBrakeY=0;
  }
  if (key==55) {
    if (redmanstatus==1) {
      imgredman = loadImage("redmanattackright.png");
      if (redmanX+100>blackmanX+20 && redmanX+100<blackmanX+80 && redmanY+50>blackmanY+20 && redmanY+50<blackmanY+120) {
        blackbloodX = blackbloodX-10 ;
        soundfile3.rewind();
        soundfile3.play();
      }
    }
    if (redmanstatus==2) {
      imgredman = loadImage("redmanattackleft.png");
      if (redmanX>blackmanX+20 && redmanX<blackmanX+80 && redmanY+50>blackmanY+20 && redmanY+50<blackmanY+120) {
        blackbloodX = blackbloodX-10 ;
        soundfile3.rewind();
        soundfile3.play();
      }
    }
  }
}

-----------------------------------------------------------------------------------------------------------------------------

ARDUINO端的程式碼 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(19200);
  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:
  int x = analogRead(A0);
  int y = analogRead(A1);
  int a = analogRead(A2);
  int b = analogRead(A3);
  int c = digitalRead(2);
  int d = digitalRead(3);
  Serial.print(x);
  Serial.print(" ");
  Serial.print(y);
  Serial.print(" ");
  Serial.print(a);
  Serial.print(" ");
  Serial.print(b);
  Serial.print(" ");
  if(c==HIGH) Serial.print(0);//
  else Serial.print(1023);//Serial.print(c);
  Serial.print(" ");
  if(d==HIGH) Serial.print(0);//
  else Serial.print(1023);//Serial.print(d);
  Serial.println();
  delay(100);
}
 
youtube連結: https://youtu.be/S13r9_q9qD4

沒有留言:

張貼留言

alanhc 互動技術-week17 [final]

回顧這學期的作品:  期中作業:LANDING:PLANET 賣點&特點: 炫麗的特效 物理(星球重力及降落)及粒子系統(噴射) 世界地圖可根據視角縮放 困難點: 重寫3次最終改寫成物件導向的CLASS寫法...