2015年6月29日 星期一

期末作品展示

期末作品:水果DIY  黃雅平陳子軒 





說明:

本遊戲的構想來源是,由於暑假的到來,炎炎夏日氣溫飆高,

人人都想喝杯飲料冰品來降暑,但是珍珠奶茶之類的飲品味道又過於濃郁,

不如來杯清爽的現榨果汁,更能帶給自己涼爽的舒適氛圍。



操作:

左右手移動可以拿取水果放在果汁機中,放置好想榨的水果後,

左右手平舉並與肩同寬同高,然後兩手上下移動(註:上移須高過頭,

下移需低於頭),一段時間後,你的特製果汁就完成囉!



影片連結:




現榨過程:

(1) 開始畫面




(2) 身體晃動直到被Kinect偵測到




(3) 拿取想要的水果原料




(4) 移動到果汁機,水果便會自己跑進去等著被榨




(5) 開始榨果汁囉! 雙手平舉與肩同寬同高,頭上頭下的移動雙手






(6) 一段時間過後,你的果汁就榨好囉!










※還有一種隱藏版果汁等著你的嘗試喔!



程式說明(部分):

(1)匯入和宣告使用物件

import SimpleOpenNI.*;
import ddf.minim.*;
SimpleOpenNI ;
Minim ;
AudioPlayer ;
PImage ;

PVector ;

(2)建立視窗/物件

void setup(){

  size(640, 480);
  openni = new SimpleOpenNI(this);
  openni.enableDepth();
  openni.enableUser();
  minim = new Minim(this);
  playerBack = minim.loadFiIe("backmusic.mp3"); 
  imgHead = loadImage("head.PNG");


}

(3)預先給予變數初始值

float posAx = 30,  posAy = 20;
int nowA = 0;
int count = 0, number = 1;
int Lx = 0;
int Red = 0;

boolean check = true;

(4)實作重畫

void draw(){
  background(255);
  openni.update();
  image(imgBack, 0, 0, 640, 480);
  
  if(check == true) {
    int[] userList = openni.getUsers();
    for(int i=0; i<userList.length; i++){
      if(openni.isTrackingSkeleton(userList[i])){
        posL = new PVector();
        posR = new PVector();
        posHead = new PVector();
        openni.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_RIGHT_HAND,posR);
        openni.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_HEAD, posHead);
        posR.x = (int)posR.x/2+320;  posR.y = 240-(int)posR.y/2;
        image(imgHandR, posR.x, posR.y, 50, 50);
        image(imgHead, posHead.x-50, posHead.y, 150, 100);
        
        if(posL.x > posAx && posL.x < posAx+100 && posL.y > posAy && posL.y < posAy+80)             Move(true, false, false, false, false, false, false, false);
       
      }
    }
  }
  
  if(frameCount%30==0){   
    nowL = (int)random(2);
  }

  switch(nowK)
  {
     case 0: image(imgKl, posKx, posKy, 120, 90); break;
     case 1: image(imgKr, posKx, posKy, 120, 90); break;
  }
  switch(nowL)
  {
     case 0: image(imgLl, posLx, posLy, 130, 80); break;
     case 1: image(imgLr, posLx, posLy, 130, 80); break;
  }
  image(imgJ, 200, 60, 260, 260);
  
  if( Rx-Lx < 130 && Ry < Hy && Ly < Hy ) {
      if(number == 0) ;
    else { image(imgL3, 250, 180, 140, 140); Other++; if(Other==10) playerJuice.play();}
  }
  else if( Rx-Lx < 130 && Ry > Hy && Ly > Hy ) {
    if(count < 5) {
  
    }
    else { image(imgR3, 250, 180, 140, 140); Other++; if(Other==10) playerJuice.play(); 
  }
  
  else if(Other >= 100) { image(imgEndBomi, 120, 30, 400, 400); check = false; Other = 101; playerOK.play();}
  
  println(Orange, Green, Red, Other);

}

(5)使用函數讓code看起來精簡順暢

void Move(boolean lockedA, boolean lockedB, boolean lockedG, boolean lockedK, boolean lockedL, boolean lockedM, boolean lockedS, boolean lockedW) {
  if(lockedG) {
    if(posGx == 275 && posGy == 210);
    else {
       posGx = posL.x-65;  posGy = posL.y-50;  
       if(posGx > 200 && posGx < 380 && posGy > 60 && posGy < 250) {
         posGx = 275; posGy = 210; count++; number*=5;
         Move(false, false, false, false, false, false, false, false);
  }}}
  if(lockedK) {
    if(posKx == 275 && posKy == 220);
    else {
       posKx = posL.x-60;  posKy = posL.y-45;  
       if(posKx > 200 && posKx < 380 && posKy > 60 && posKy < 250) {
         posKx = 275; posKy = 220; count++; number*=7;
         Move(false, false, false, false, false, false, false, false);
  }}}
  if(lockedS) {
    if(posSx == 275 && posSy == 170);
    else {
       posSx = posR.x-55;  posSy = posR.y-55;  
       if(posSx > 200 && posSx < 380 && posSy > 60 && posSy < 250) {
         posSx = 275; posSy = 170; count++; number*=17;
         Move(false, false, false, false, false, false, false, false);
}

 void onNewUser(SimpleOpenNI curContext, int userId)
{
  curContext.startTrackingSkeleton(userId);

}

沒有留言:

張貼留言