期末作品:水果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);
}
沒有留言:
張貼留言