顯示具有 期末作品 標籤的文章。 顯示所有文章
顯示具有 期末作品 標籤的文章。 顯示所有文章

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






week19

期末作品
void setup(){
  pinMode(3,INPUT);
  pinMode(10,OUTPUT);
  pinMode(7,OUTPUT);
}
void loop(){
  byte gb = digitalRead(3);
  if(gb == 0){
    digitalWrite(7,HIGH);
    digitalWrite(10,LOW);
     tone(8,0);
  }else{
    digitalWrite(7,LOW);
    digitalWrite(10,HIGH);
    tone(8,200);
    //tone(8,2000);
  }
}


期末作品 神奇小筆

神奇小筆

三種顏色的筆
紅色鋪路,藍色檔烏龜,綠色擋香菇
60秒會碰到公主及過關







<arduino>

int switchStateRed = 0;
int switchStateBlue = 0;
int switchStateGreen = 0;


void setup(){
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);

  Serial.begin(9600);
}

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

  if(switchStateRed == HIGH) {
    //Serial.write(3);
    Serial.print(3);
  }
  if(switchStateGreen == HIGH) {
    //Serial.write(2);
    Serial.print(2);
  }
  if(switchStateBlue== HIGH) {
    //Serial.write(1);
    Serial.print(1);
  }

  delay(100);
}

<processing>


import processing.serial.*;
Serial serial;

import ddf.minim.*;
Minim minim;
AudioPlayer star;

PImage imgBG, imgGreen, imgBlue, imgRed, cloudA, cloudB;
PImage man, man1, man2, man3, man4, wife;
PImage mon1, mon2, winImage,paint;
int index;
boolean Game=false;
int wifeX=640, wifeY=250;
boolean wifeF=false;
int cloudX[]= {
  640, 800, 900, 1000
};
int cloudY[]= {
  100, 150, 80, 75
};
int cloudType[]= {
  1, 2, 1, 1
};

int[] I = {
  -1282, -1281, -1280, -1279, -1278, 
  -642, -641, -640, -639, -638, 
  -2, -1, 0, 1, 2, 
  638, 639, 640, 641, 642, 
  1279, 1278, 1280, 1281, 1282
};

int[] I2 = {
  -1279, -1278, -1277, -1276, -1275, 
  -639, -638, -637, -636, -635, 
  1, 2, 3, 4, 5, 
  641, 642, 643, 644, 645, 
  1281, 1282, 1283, 1284, 1285
};

int hole=100;
int HTime=300;

void setup() {
  serial=new Serial(this, "COM3", 9600);
  minim = new Minim(this);
  star=minim.loadFile("Mario.mp3");
  music();
  size(640, 480);
  man=loadImage("man.png");
  man1=loadImage("man1.png");
  man2=loadImage("man2.png");
  man3=loadImage("man3.png");
  man4=loadImage("man4.png");
  mon1=loadImage("air.png");
  mon2=loadImage("mon.png");  
  winImage=loadImage("win.jpg");
  wife=loadImage("wife.png");
  cloudA=loadImage("cloud.png");
  cloudB=loadImage("cloudB.png");
  paint=loadImage("pen.png");
  imgBG=createImage(640, 480, RGB);
  imgGreen=createImage(640, 480, RGB);
  imgRed=createImage(640, 480, RGB);
  imgBlue=createImage(640, 480, RGB);

  clBK();
  clPen(imgGreen);
  clPen(imgRed);
  clPen(imgBlue);

  road();
}
int mon1X[]= {
  640, 800
};
int mon1Y[]= {
  210, 250
};
int manX=200, manY=250;
int mon2Y=-100;

int S=0, S2=0;
int Color=0;
boolean death=false;
int dlong=80;//if or not fall
int s, read;
boolean win=false;
boolean lossmousic=false;

void draw() {
  noCursor();
  background(imgBG);
  clBK();

  if (serial.available()>0)
  {
    read=serial.read();
    println(read);
    if (read==49)Color=0;
    if (read==50)Color=1;
    if (read==51)Color=2;
  }

  bkDraw();

  if (Game) {
    if (s==0)s=60;
    int s2 = second();
    if (s-1==s2)wifeF=true;
    if (wifeF) {
      image(wife, wifeX, wifeY, 100, 100);
      wifeX--;
      if (wifeX-manX<50) {
        win=true;
        Game=false;
      }
    }
    for (int i=0;i<4;i++) {
      if (cloudType[i]%2==0)image(cloudA, cloudX[i], cloudY[i], 100, 50);
      else image(cloudB, cloudX[i], cloudY[i], 100, 50);
      cloudX[i]--;
      if (cloudX[i]<0)newcloud(i);
    }

    runman();

    for (int i=0;i<2;i++) {
      image(mon1, mon1X[i], mon1Y[i], 100, 100);
      int I=(mon1Y[i]-1)*640+mon1X[i]-1;
      imgBlue.loadPixels();
      for (int j=0;j<100;j++) {
        if (imgBlue.pixels[I]==color(#1B16D6)) {
          mon1X[i]=640+(int)random(5)*50;
          mon1Y[i]=200+(int)random(100);
          clPen(imgBlue);
          break;
        }
        I+=640;
      }
      imgBlue.updatePixels();
      if (dist(manX, manY, mon1X[i], mon1Y[i])<=95) {
        Game=false;
        death=true;
        lossmousic=true;
      }
      mon1X[i]-=3;
    } //tortoise

    image(mon2, 200, mon2Y, 100, 100);
    int J=(mon2Y+100-1)*640+200-1;
    imgGreen.loadPixels();
    for (int j=0;j<100;j++) {
      if (J<0)break;
      if (imgGreen.pixels[J]==color(#297111)) {
        mon2Y=-(int)random(100)-100;
        clPen(imgGreen);
        break;
      }
      J++;
    }

    imgGreen.updatePixels();
    if (dist(manX, manY, 200, mon2Y)<=95) {
      Game=false;
      death=true;
      lossmousic=true;
    }
    mon2Y++;//mushroom

    back();
    boolean fall=true;
    imgRed.loadPixels();
    for (int i=24;i>=0;i--) {
      if (imgRed.pixels[223659+I2[i]]==color(#FF0000)) {
        manY=(223659+I2[i])/640-100;
        fall=false;
        dlong=80;
      }
    }
    if (fall) {
      dlong--;
      if (dlong==0) {
        manY=400;
        Game=false;
        death=true;
        lossmousic=true;
      }
    }


    imgRed.updatePixels();



    if (Color==0)pen(imgBlue, color(#1B16D6));
    else if (Color==1)pen(imgGreen, color(#297111));  
    else pen(imgRed, color(#FF0000));
  }
  else {
    if (win) {
      image(winImage, 0, 0, 640, 480);
    }
    else {
      s = second();
      if (death) {
        image(man4, manX, manY, 100, 100);
        if (lossmousic) {
          star.close(); 
          star=minim.loadFile("loss.mp3");
          music();
        }
      }
      else image(man, manX, manY, 100, 100);
      lossmousic=false;
    }
  }
  
  image(paint,mouseX-10,mouseY-80,100,100);
}

void runman() {
  if (S%20==0)S2++;
  if (S2%3==0)image(man1, manX, manY, 100, 100);
  else if (S2%3==1)image(man3, manX, manY, 100, 100);
  else image(man2, manX, manY, 100, 100);
  S++;//run
}

void mouseClicked() {
  Game=true;
}

void newcloud(int i) {
  cloudX[i]=640+(int)random(100);
  cloudY[i]=(int)random(100);
  cloudType[i]=(int)random(10);
}


void road() {
  imgRed.loadPixels();
  int RI=350*640;
  for (int i=350*640;i<640*480;i++) {
    if (i<352*640)imgRed.pixels[i]=color(#FF0000);
    else imgRed.pixels[i]=color(#AA5D1D);
  }

  imgRed.updatePixels();
}

void back() {
  if (HTime==0) {
    hole=((int)random(2)+1)*100;
    HTime=((int)random(3)+2)*60;
  }
  if (hole<=0) {
    HTime--;
  }
  imgRed.loadPixels();
  for (int i = 1;i<imgRed.pixels.length-1;i++) {
    if ((i+1)%640==0) {
      imgRed.pixels[i]=color(#000000);
      if (i>=224639&&(i-224639)%640==0) {
        if (hole<0) {
          if (i==224639||i==225279)imgRed.pixels[i]=color(#FF0000);
          else imgRed.pixels[i]=color(#AA5D1D);
        }
      }
      continue;
    }
    imgRed.pixels[i]=imgRed.pixels[i+1];
  }
  hole--;
  imgRed.updatePixels();
}

void bkDraw() {
  imgBG.loadPixels();
  imgRed.loadPixels();
  imgBlue.loadPixels();
  imgGreen.loadPixels();
  for (int i = 1;i<imgRed.pixels.length-1;i++) {
    if (imgRed.pixels[i]!=color(#000000))
      imgBG.pixels[i]=imgRed.pixels[i];
    if (imgBlue.pixels[i]!=color(#000000))
      imgBG.pixels[i]=imgBlue.pixels[i];
    if (imgGreen.pixels[i]!=color(#000000))
      imgBG.pixels[i]=imgGreen.pixels[i];
  }
  imgBG.updatePixels();
  imgRed.updatePixels();
  imgBlue.updatePixels();
  imgGreen.updatePixels();
}

void clBK() {
  imgBG.loadPixels();
  for (int i = 0;i<imgBG.pixels.length;i++) {
    imgBG.pixels[i]=color(#18DBEA);
  }
  imgBG.updatePixels();
}
void clPen(PImage img) {
  img.loadPixels();
  for (int i = 0;i<imgBG.pixels.length;i++) {
    img.pixels[i]=color(#000000);
  }
  img.updatePixels();
}

void pen(PImage img, color c) {
  index=(mouseY-1)*640+mouseX-1;
  img.loadPixels();
  int I2;
  for (int i=0;i<25;i++) {
    I2=index+I[i];
    if (mouseX>=638||mouseY<=2||mouseX<=2||mouseY>=478)break;
    img.pixels[I2]=c;
  }
  img.updatePixels();
}
void music() {
  star.loop();
}
void stop() {
  star.close();
  minim.stop();
  super.stop();
}