2014年1月19日 星期日

2014年1月17日 星期五

期末作品-天才小釣手

 
期末成果~

天才小釣手


材料:兩片L型鐵片,一盒迴紋針工具盒,兩雙竹筷子,瞬間膠,一隻原子筆

過程:首先用L型鐵片做出電路,中間用筆筒配合竹筷子做出一個軸,垂吊著一個迴紋針讓它可以以軸轉圈圈讓電路通電,利用電路通電的原理來達成計算次數上的功能,在利用瞬間膠和竹筷子做出釣魚竿把手的部分,可以順時針轉動,讓電路不段通電,程式就不段的計算次數,讓我們遊戲裡面的主角收竿,最後將魚釣起!

製作流程 實體部分1天、程式部分約一星期。

謝謝小葉老師的用心!!

新年快樂!

0%

2014年1月12日 星期日

Week19 00161036魏正期末作品

互動技術期末作品
作品名稱:LED Cube 8x8x8
作品介紹:
此作品欲達成裸視3D的效果,並使觀眾能從任何角度欣賞動畫,創作過程使用512顆燈泡並依照8x8x8的架構進行焊接,底板晶片使用Arduino UNO來燒錄動畫程式,未來展望欲將體感裝置和此作品藉由PC溝通產生出新的體感操作模式,讓觀眾和展演者能不拘泥於任何方位demo都無觀賞死角,謝謝大家。

Week19_Final_彈珠台

##Demo影片



##製作到完成照片

一開始的拆箱、定尺寸、畫位置
























測試電路、設計開關(感應區)















電路和版面組合


展開的樣子
組裝好後的外觀






































玩的照片~
全亮燈的樣子
























## Arduino程式碼

import processing.serial.*;
PFont font;
Serial serial;
int pon=0;
void setup()
{
  size(600, 400);
  background(0,0,0);
  serial=new Serial(this, "COM3", 9600);
}

void draw()
{
  background(0,0,0);
   if (serial.available()>0)
  {
    int a=serial.read();
    print(a+" ");
         if(a==97)     {    pon+=0;    }//a
    else if(a==98)     {    pon+=20;   }//b
    else if(a==99)     {    pon+=0;    }//c
    else if(a==100)    {    pon+=25;   }//d
    else if(a==101)    {    pon+=0;    }//e
    else if(a==102)    {    pon+=50;   }//f
    else if(a==103)    {    pon+=0;    }//g
    else if(a==104)    {    pon+=20;   }//h
    //else if(a==105)    {    pon+=0;    }//i
    //else if(a==106)    {    pon+=10;   }//j
        
    textFont(createFont("calibri",40));
    textSize(100);
    text("Score:"+pon,50,210);
  
  }
}

## Processing 程式碼

import processing.serial.*;
PFont font;
Serial serial;
int pon=0;
void setup()
{
  size(600, 400);
  background(0,0,0);
  serial=new Serial(this, "COM3", 9600);
}

void draw()
{
  background(0,0,0);
   if (serial.available()>0)
  {
    int a=serial.read();
    print(a+" ");
         if(a==97)     {    pon+=0;    }//a
    else if(a==98)     {    pon+=20;   }//b
    else if(a==99)     {    pon+=0;    }//c
    else if(a==100)    {    pon+=25;   }//d
    else if(a==101)    {    pon+=0;    }//e
    else if(a==102)    {    pon+=50;   }//f
    else if(a==103)    {    pon+=0;    }//g
    else if(a==104)    {    pon+=20;   }//h
    //else if(a==105)    {    pon+=0;    }//i
    //else if(a==106)    {    pon+=10;   }//j
        
    textFont(createFont("calibri",40));
    textSize(100);
    text("Score:"+pon,50,210);
  
  }
}


第十九週期末展示

  結合Arduino音樂擴充版製作的MP3播放器,可進行播放/暫停,下一曲,上一曲以及音量控制。



影片:


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);
 
  }
}






第18組期末 Ball&Maze

這是個控制球通過迷宮,類似電流急急棒,必須摸黑,依靠你的記憶力努力達到終點的遊戲

                                              開始畫面
失敗畫面


抵達終點

影片連結
遊戲試玩:
   
開掛直接抵達終點: