整個系統工作情況:
左邊的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);
}
}