2019年1月1日 星期二

Week16 呆江與泓丞的期末作品

製作期末作品

1.關卡設計

基於我們的按鈕僅買了4個,所以我們把關卡改成3關

2.設計上的改變

(1)考慮新增LED紅燈當生命值
(2)增加障礙怪物

3.修正的問題

(1)轉場
(2)怪物吸起來卡卡

裝置圖



基本架構都跟上周提及的差不多,但在期末展示的時候我們沒有展示到一些內容,
透過部落格跟大家分享一下我們遇到的狀況......

1.紅色LED燈怎麼沒在裝置上

因為製作的時候我們把盒子弄壞了,所以緊急製作了簡易裝製上台

2.障礙怪物並沒有出現

我們嘗試新增2隻障礙怪物在場上的時候,發現會有掉貞的狀況,為了不要讓我們的作品看起來節奏太過緩慢,沒有把這個功能拿出來展示

刪除上面題及的遊戲機制後,整個遊戲雖然很流暢,
但缺少了死亡的可能,會讓人覺得很乏味
雖然起初確實是要製作讓人放鬆的小遊戲,但少了死掉的條件還真的玩久了會無聊

最後,分享一下我們的程式碼

Processing:

//characters
PImage[] imgBG=new PImage[7];  PImage[] imgKirby=new PImage[4];  PImage[] imgMonster=new PImage[6];

float [] MonsterX = new float[80];  float [] MonsterY = new float[80];
float  MonsterVX=8 ;  float [] MonsterVY = new float[80];
//Die Monster
float DieX;  float DieY;  float DieVX=8;  float DieVY;
//reboorn
boolean [] MonsterDie = new boolean[80];
float [] MonsterDieVX = new float[80];  float [] MonsterDieVY = new float[80]; 

//change bg
int c=1;
//store score
int score=0;  int score2=0;  int score3=0;

import processing.serial.*;
Serial myPort;  
int val;
import ddf.minim.*;
Minim minim;
AudioPlayer player;

//reborn monster
void reborn(int i){
  MonsterDie[i] = false;
  MonsterX[i] = -random(1000);  MonsterY[i] = random(30,630);
}
void reborn2(int i){
  MonsterDie[i] = false;
  MonsterX[i] = random(1300,2500);  MonsterY[i] = random(30,630);
}
//level change
void level(int a){
  if(a>=30){
    for(int i=0; i<40; i++){
    MonsterX[i] = -random(1000);  MonsterY[i] = random(30,630);
    MonsterVY[i] = random(-1,2);
    MonsterDie[i] = false;
    }
    for(int i=40;i<80;i++){
      MonsterX[i] = random(1300,2500);  MonsterY[i] = random(30,630);
       MonsterVY[i] = random(-1,2);
      MonsterDie[i] = false;
    }
  }
}

void setup(){
  size(1280,720);
  minim = new Minim(this);
  player = minim.loadFile("kirby.mp3",2048);
  player.play();
  player.loop();
  String portName = Serial.list()[0];  
  myPort = new Serial(this,"COM3", 9600);
  //load background and characters
  for(int i=0; i<3; i++){
    imgBG[i] = loadImage("bg0"+i+".jpg");
  }
  imgBG[3] = loadImage("lv01.jpg");
  imgBG[4] = loadImage("lv02.jpg");
  imgBG[5] = loadImage("bg.jpg");
  for(int i=0; i<4; i++){
    imgKirby[i] = loadImage((i+1)+".png");
  }
  for(int i=0; i<6; i++){
    imgMonster[i] = loadImage("00"+(i+1)+".png");
  }
  //stat bg & text
  image(imgBG[0],width/500,height/300,width,height);
  fill(30,30,30);
  rect(400,250,500,60,7);
  textSize(50);
  fill(255,255,255);
  text("Press Space to Start",410,300);
  //original coordinates
  for(int i=0; i<40; i++){
    MonsterX[i] = -random(1000);  MonsterY[i] = random(30,630);
    MonsterVY[i] = random(-1,2);
    MonsterDie[i] = false;
  }
  for(int i=40;i<80;i++){
    MonsterX[i] = random(1300,2500);  MonsterY[i] = random(30,630);
     MonsterVY[i] = random(-1,2);
    MonsterDie[i] = false;
  }
}
boolean check = true;
void draw(){
  if (myPort.available() > 0) {     
     val = myPort.read();   
  }
  if(val==1 && check==true){
    check=false;
    c++;
  }
  if(val==0 && check==false){
    check=true;
  }
  
  //description bg
  if(c==2) {
    image(imgBG[1],width/500,height/300,width,height);
  }
  //game bg
  if(c==3){ 
    image(imgBG[2],width/500,height/300,width,height);
    //level 1 Monster
    for(int i=0;i<40;i++){
      MonsterX[i] += MonsterVX;
      image(imgMonster[0],MonsterX[i],MonsterY[i],90,90);
      if(MonsterX[i] > 1200){
        MonsterDie[i] = true;
        reborn(i);
      }
    }
    for(int i=40;i<80;i++){
      MonsterX[i] -= MonsterVX;
      image(imgMonster[4],MonsterX[i],MonsterY[i],90,90);
      if(MonsterX[i] < 0){
        MonsterDie[i] = true;
        reborn2(i);
      }
    }
    for(int i=0;i<80;i++){
      if(val==2){
        if(score<=30 && c==3){
          MonsterDieVX[i] = (540-MonsterX[i])/8;
          MonsterDieVY[i] = (450-MonsterY[i])/8;
          if(dist(540,450,MonsterX[i],MonsterY[i])<300){
            if(MonsterX[i]>620 && i < 40){
              MonsterX[i]-=5;
              MonsterY[i]+=MonsterDieVY[i];
            }
            if(MonsterX[i]<460 && i > 40){
              MonsterX[i]+=25;
              MonsterY[i]+=MonsterDieVY[i];
            }
            else{
              MonsterX[i]+=MonsterDieVX[i];
              MonsterY[i]+=MonsterDieVY[i];
            }
          }
          if(dist(540,450,MonsterX[i],MonsterY[i])<80){
            MonsterDie[i]=true;
            score++;
            reborn(i);
          }
        }
      }
    }
    //level 1 Kirby(520,450)
    image(imgKirby[0],520,450,120,120);
  }
  //level 1 Monster
  if(score>=30 && c==3){
    level(score);
    image(imgBG[3],width/500,height/300,width,height);
  }
  if(c==4){  
    image(imgBG[2],width/500,height/300,width,height);
    //level 2 Monster
    for(int i=0;i<40;i++){
      MonsterX[i] += MonsterVX;
      image(imgMonster[0],MonsterX[i],MonsterY[i],90,90);
      if(MonsterX[i] > 1200){
        MonsterDie[i] = true;
        reborn(i);
      }
    }
    for(int i=40;i<80;i++){
      MonsterX[i] -= MonsterVX;
      image(imgMonster[4],MonsterX[i],MonsterY[i],90,90);
      if(MonsterX[i] < 0){
        MonsterDie[i] = true;
        reborn2(i);
      }
    }
    for(int i=0;i<80;i++){
      if(val==2){
        if(score<=60 && c==4){
         MonsterDieVX[i] = (540-MonsterX[i])/8;
         MonsterDieVY[i] = (450-MonsterY[i])/8;
         if(dist(540,450,MonsterX[i],MonsterY[i])<300){
           if(MonsterX[i]>620 && i < 40){
              MonsterX[i]-=5;
              MonsterY[i]+=MonsterDieVY[i];
            }
            if(MonsterX[i]<460 && i > 40){
              MonsterX[i]+=25;
              MonsterY[i]+=MonsterDieVY[i];
            }
            else{
              MonsterX[i]+=MonsterDieVX[i];
              MonsterY[i]+=MonsterDieVY[i];
            }
         }
         if(dist(540,450,MonsterX[i],MonsterY[i])<80){
           MonsterDie[i]=true;
           score++;
           reborn(i);
          }
        }
      }
      if(val==4){
        if(score2<=30 && c==4){
         MonsterDieVX[i] = (175-MonsterX[i])/8;
         MonsterDieVY[i] = (150-MonsterY[i])/8;
         if(dist(175,150,MonsterX[i],MonsterY[i])<300){
           if(MonsterX[i]>255 && i < 40){
              MonsterX[i]-=5;
              MonsterY[i]+=MonsterDieVY[i];
            }
            if(MonsterX[i]<95 && i > 40){
              MonsterX[i]+=25;
              MonsterY[i]+=MonsterDieVY[i];
            }
            else{
              MonsterX[i]+=MonsterDieVX[i];
              MonsterY[i]+=MonsterDieVY[i];
            }
         }
         if(dist(175,150,MonsterX[i],MonsterY[i])<80){
           MonsterDie[i]=true;
           score2++;
           reborn(i);
         }
        }
      }
    }
    //level 2 Kirby(175,150)
    image(imgKirby[0],520,450,120,120);
    image(imgKirby[1],175,150,120,120);
  }
  if(score>=60 && score2>=30 && c==4){
    level(score2);
    image(imgBG[4],width/500,height/300,width,height);
  }
  if(c==5){
    image(imgBG[2],width/500,height/300,width,height);
    //level 3 Monster
    for(int i=0;i<40;i++){
      MonsterX[i] += MonsterVX;
      image(imgMonster[0],MonsterX[i],MonsterY[i],90,90);
      if(MonsterX[i] > 1200){
        MonsterDie[i] = true;
        reborn(i);
      }
    }
    for(int i=40;i<80;i++){
      MonsterX[i] -= MonsterVX;
      image(imgMonster[4],MonsterX[i],MonsterY[i],90,90);
      if(MonsterX[i] < 0){
        MonsterDie[i] = true;
        reborn2(i);
      }
    }
    //level 3 Kirby(1000,300)
    image(imgKirby[0],520,450,120,120);
    image(imgKirby[1],175,150,120,120);
    image(imgKirby[2],1000,300,120,120);
    for(int i=0;i<80;i++){
      if(val==2){
        if(score<=90 && c==5){
         MonsterDieVX[i] = (540-MonsterX[i])/8;
         MonsterDieVY[i] = (450-MonsterY[i])/8;
         if(dist(540,450,MonsterX[i],MonsterY[i])<300){
           if(MonsterX[i]>620 && i < 40){
              MonsterX[i]-=5;
              MonsterY[i]+=MonsterDieVY[i];
            }
            if(MonsterX[i]<460 && i > 40){
              MonsterX[i]+=25;
              MonsterY[i]+=MonsterDieVY[i];
            }
            else{
              MonsterX[i]+=MonsterDieVX[i];
              MonsterY[i]+=MonsterDieVY[i];
            }
         }
         if(dist(540,450,MonsterX[i],MonsterY[i])<80){
           MonsterDie[i]=true;
           score++;
           reborn(i);
          }
        }
      }
      if(val==4){
        if(score2<=60 && c==5){
         MonsterDieVX[i] = (175-MonsterX[i])/8;
         MonsterDieVY[i] = (150-MonsterY[i])/8;
         if(dist(175,150,MonsterX[i],MonsterY[i])<300){
           if(MonsterX[i]>255 && i < 40){
              MonsterX[i]-=5;
              MonsterY[i]+=MonsterDieVY[i];
            }
            if(MonsterX[i]<95 && i > 40){
              MonsterX[i]+=25;
              MonsterY[i]+=MonsterDieVY[i];
            }
            else{
              MonsterX[i]+=MonsterDieVX[i];
              MonsterY[i]+=MonsterDieVY[i];
            }
         }
         if(dist(175,150,MonsterX[i],MonsterY[i])<80){
           MonsterDie[i]=true;
           score2++;
           reborn(i);
           }
        }
      }
      if(val==5){
        if(score3<=30 && c==5){
         MonsterDieVX[i] = (1000-MonsterX[i])/8;
         MonsterDieVY[i] = (300-MonsterY[i])/8;
         if(dist(1000,300,MonsterX[i],MonsterY[i])<300){
           if(MonsterX[i]>1000 && i < 40){
              MonsterX[i]-=5;
              MonsterY[i]+=MonsterDieVY[i];
            }
            if(MonsterX[i]<1000 && i >= 40){
              MonsterX[i]+=25;
              MonsterY[i]+=MonsterDieVY[i];
            }
            else{
              MonsterX[i]+=MonsterDieVX[i];
              MonsterY[i]+=MonsterDieVY[i];
            }
         }
         if(dist(1000,300,MonsterX[i],MonsterY[i])<80){
           MonsterDie[i]=true;
           score3++;
           reborn(i);
         }
        }
      }
    }
  }
  if(score>=90 && score2>=60  && score3>=30 && c==5){
    level(score3);
    image(imgBG[5],width/500,height/300,width,height);
  }
  
}


沒有留言:

張貼留言