2014年1月12日 星期日

week19 期末作業:瘋狂吉他手








整個系統工作情況:
左邊的4個按鈕就像吉他左手按玹 ,右手類似播玹,只是我改成按鍵而已。當左手按住某個按鈕時,右手也要跟著按,該鈕顯示的打擊方塊才會亮起,這時只要有韻律方塊也在該位置附近,這樣才能形成有效打擊,Score會加分數,也會有combo顯現。
遊戲執行時,視窗的左邊會有背景影片出現和分數,右邊則是
遊戲進行的畫面,4條通道和1條血條,有有效打擊會有combo出現還會加血,沒有的話漏掉方塊的話則會扣血。血量歸0,遊戲則結束並且有失敗畫面。不然就是等到背景影片播完,即勝利,會有勝利圖片然後計算總分。

心得:
一開始接線的時候,按鈕都沒接電阻,就一直短路,也不知道為啥。接了電阻就好了,不知道是不是因為沒電阻電壓太大,arduino的板子,就直接掛給你看。
然後起初當然是卡在processing如何和arduino做配合~
之後配合processing裡面的函示庫,很多問題都迎刃而解,
不過兩者的配合有一定程度上的lag,這時候就一直在嘗試改arduino的delay()值。
之後又卡在,如何讓方塊跟著音樂有節奏~~
還有方塊與方塊間,避免他們連在一起。
血條用兩張圖片做配合~~沒有意外。
只是悲劇的是processing的版本好像跟學校的不合
影片展示時就顯得很亂~~Q.Q

以下是所使用程式
arduino;


int switchStateRed = 0;
int switchStateBlue = 0;

void setup(){
   pinMode(2 , INPUT);
  pinMode(3, INPUT);
  Serial.begin(9600);
  }

  int a=0,b=0;

  void loop(){
    switchStateRed = digitalRead(2);
   switchStateBlue = digitalRead(3);

  if(switchStateRed == LOW) a=0;
 if(switchStateRed == HIGH && a==0){Serial.write('a');a=1;}
   if(switchStateRed == LOW) b=0;
 if(switchStateRed == HIGH && b==0){Serial.write('b');b=1;}

 
 
  }


processing



import ddf.minim.*;
import processing.video.*; //導入 video 程式庫

import processing.serial.*;


Minim minim;
AudioPlayer in;
Serial serial;
Movie movie; //宣告 Movie 物件
int hand,handX;
PImage rback,lb,blood,bblood,rbb,blue,red,green,yellow,push,bg,die,win;
int score,blo,plo;
int a,i,j,dieo,winn,sum,com;

float []msX=new float[200],msY=new float[200];//x,y
float []msVX=new float[200],msVY=new float[200];
float []bl=new float[200];
int []thing = new int[200];



void setup() {
com=0;

dieo=1;
winn=0;
  size(1300, 600);
score=0;
sum=0;
a=0;
j=0;
blo=0;
plo=565;
   movie = new Movie(this, "aaa.mov");
   minim=new Minim(this);
  rback=loadImage("rback.jpg");
   lb=loadImage("lb.jpg");
    blood=loadImage("blood.jpg");
     rbb=loadImage("rbb.jpg");
      bblood=loadImage("bblood.jpg");
       red=loadImage("red.jpg");
    blue=loadImage("blue.jpg");
     yellow=loadImage("yellow.jpg");
      push=loadImage("yellow.jpg");
      green=loadImage("green.jpg");
      bg=loadImage("bg.jpg");
       die=loadImage("die.jpg");
       win=loadImage("winn.jpg");
  // 開啟 Serial port,通訊速率為 9600 bps

  // 注意! 如果你 Arduino 不是接在 COM4,請做適當調整

  serial = new Serial(this, "COM4", 9600);
   movie.play();
 
   for (int i=0;i<200;i++) {
    newms(i);
    thing[i]=0;
    bl[i]=0;
  }

}
void movieEvent(Movie movie){
//讓 quicktime movie 通知 Processing 有一個畫格已經準備好可以被播放
  movie.read();
/* 由 Movie 類別中呼叫 read() 函數,以便讀入當前畫格資料至 Movie 類別中,準備呈像 */
}


void draw() {

  if(dieo==0)
  {
 
    movie.stop();
   last(0);
   stop();
 
  }

  else if(sum>1500)
  {
     movie.stop();
   last(1);
   stop();
 
  }
  else
  {

  image(lb,0, 0,900,522);
   image(movie, 40, 30);
     image(bblood, 0,522,900, 100);
     image(rbb, 900, 0,405, 605);
    image(rback, 920, 15,360, 570);
    image(blood,1200, 15,72,565 );
     image(bg,1200, 15,72, blo );
    textSize(32);
    text("Score:", 0, 572);
    text(score,100, 572);
    fill(255, 255, 255);
 
    if(com!=0)
    {
    textSize(60);
    text("COMBO", 928, 100);
    text(com,1028, 150);
    fill(0, 255, 0);
    }
 
    handX = 0;
    hand = 0;
   /*
    image(blue, 928, 15,60, 20);
    image(yellow, 996, 15,60, 20);
    image(green, 1064,15,60, 20);
    image(red,1132, 15,60,20 );*/
 
    for ( i=0;i<a;i++) {
    if (msX[i]==928.0)                                                    
      image(blue, msX[i], msY[i], 60, 20);
    else if (msX[i]==996.0)                                              
      image(yellow, msX[i], msY[i], 60, 20);
    else if (msX[i]==1064.0)                                                    
      image(green, msX[i], msY[i], 60, 20);
    else if (msX[i]==1132.0)                                              
      image(red, msX[i], msY[i], 60, 20);
    if(msY[i]<610)
    {
 
    msY[i]+=10;
 
    }
    }

   
   
 
  if ( serial.available() > 0) {

    // 讀取從 Serial Port 傳進來的 Sensor 讀值

    hand = serial.read();
 
 
 
 
 
 
    if(hand=='A'){
  handX = 928;
  image(push, handX, 450.0, 60, 20);


 
   for ( i=0;i<a;i++)       //有效打擊範圍+combo+分數+血量
   {
     if(msY[i]<471 && msY[i]>439)
     {
       if(msX[i]==928)
       {
         if ((461.0 > msY[i]) && (447.0 < msY[i]));
         {
         score=score+100;
        msY[i]=610;
        com=com+1;
         if(plo<=535)
         plo=plo+30;
         }
       }
     }
   
 
   }
  }






   else if(hand=='B'){
    handX=996;
    image(push, handX, 450, 60, 20);
 
   for ( i=0;i<a;i++)
   {
   
     if(msY[i]<471 && msY[i]>439)
     {
       if(msX[i]==996)
       {
         if ((461.0 > msY[i]) && (447.0 < msY[i]));
         {
         score=score+100;
          msY[i]=610;
          com=com+1;
          if(plo<=535)
         plo=plo+30;
         }
       }
     }
   }
  }






   else if(hand=='C'){
  handX = 1064;
  image(push, handX, 450.0, 60, 20);

   for ( i=0;i<a;i++)
   {
   
   
       if(msY[i]<471 && msY[i]>439)
     {
       if(msX[i]==1064)
       {
         if ((461.0 > msY[i]) && (447.0 < msY[i]));
         {
         score=score+100;
          msY[i]=610;
          com=com+1;
          if(plo<=535)
         plo=plo+30;
         }
       }
     }
   }
  }







  else if(hand=='D'){
    handX=1132;
    image(push, handX, 450.0, 60, 20);
 
    for ( i=0;i<a;i++)
    {
      if(msY[i]<471 && msY[i]>439)
     {
       if(msX[i]==1132)
       {
         if ((461.0 > msY[i]) && (447.0 < msY[i]));
         {
         score=score+100;
          msY[i]=610;
          com=com+1;
          if(plo<=535)
         plo=plo+30;
         }
       }
     }
    }
  }
/*
  if(sensorValue0=='Z'){
   sensorValue0=1000;

  }*/





  }

   if(com!=0)                          //combo累計
    {
    textSize(60);
    text("COMBO", 928, 100);
    text(com,1028, 150);
    fill(0, 255, 0);
    }



   for(int u=0;u<a;u++)   //損寫機制+combo歸0+失敗檢測
  {
   if(msY[u] >600 && bl[u]==0 )
   {
     if(blo<570)
     {
   blo=blo+3;
   image(bg,1200, 15,72, blo );
    bl[u]=1;
    com=0;
     }
     else
    dieo=0;
   }
  }



  if(i<200 && j%10==0)

   ++a;
    ++j;

 sum++;
 println(com);

}
}
void newms(int i) {

  //float angle=random(2*PI);
  if(i%3==0 && i<196)         //方塊速度
  {
  msVY[i]=8;
  msVY[i+1]=8;
  msVY[i+2]=8;
  }
  int dir=int(random(4));    //隨機在4個通道產生方塊
  if (dir==0) {
    msX[i]=928.0;
    msY[i]=0.0;
 
 
  }
  else if (dir==1) {
    msX[i]=996.0;
    msY[i]=0.0;
  }
  else if (dir==2) {
    msY[i]=0.0;
    msX[i]=1064.0;
  }
  else if (dir==3) {
    msY[i]=0.0;
    msX[i]=1132.0;
  }
}

void last(int i){                    //失敗畫面和勝利畫面
  if(i==0)
  {
  image(die, 0,0,1200, 600);
   in=minim.loadFile("hdie.mp3");
    in.play();
     textSize(50);
    text("Score:", 100, 422);
    text(score,300, 422);
    fill(255, 255, 255);
  }
  else if(i==1)
  {
 
    image(win, 0,0,1200, 600);
   in=minim.loadFile("hwin.mp3");
    in.play();
     textSize(50);
    text("Score:", 800, 272);
    text(score,980, 272);
    fill(255, 0, 0);
 
  }
}






沒有留言:

張貼留言