顯示具有 Week17 標籤的文章。 顯示所有文章
顯示具有 Week17 標籤的文章。 顯示所有文章

2015年7月5日 星期日

期末作品展示





功能簡介:
   能夠偵測人的手臂,伸直為投出,縮回為新增一個球,用拋物線進行投籃



程式碼:
import kinect4WinSDK.Kinect; import kinect4WinSDK.SkeletonData; import ddf.minim.*; AudioPlayer player; Minim minim; Kinect kinect; ArrayList <SkeletonData> bodies; float ballX=900,ballY=600,ballVX=0,ballVY=0,ballFristX=500,ballFristY=600; float basketX = 50 , basketY = 100; float counflyX =0, counflyY = 0; float grade = 0; boolean flying=false,isflying=false,ifball=false; PVector v1,v2; float i=0,i1 = 0,x=30,G=0.98,ballmove; PImage Curry01,Curry02,net,imgBG; float timeCount=3000; float[] goal = new float [100]; boolean gamestart=false; boolean gameover=false; boolean loadgame=false; void setup(){ size(1000,700); kinect = new Kinect(this); smooth(); bodies = new ArrayList<SkeletonData>(); Curry01 = loadImage("curry01.jpg"); Curry02 = loadImage("curry02.jpg"); net = loadImage("basketnet.jpg"); // minim = new Minim(this); //player = minim.loadFile("NBA.mp3", 2048); imgBG = loadImage("NBA.jpg"); } void draw(){ //background(255); println(gamestart,gameover); if(gamestart){ gameStart(); scoreShow(); } else{ textSize(20); fill(250, 160, 0); text("Wave to Start!",450,300); } for (int i=0; i<bodies.size (); i++) { drawSkeleton(bodies.get(i)); drawPosition(bodies.get(i)); } } void scoreShow(){ if(gameover){ fill(0); rect(-10,-10,1100,800); textSize(30); fill(250, 160, 0); text("Your Score: "+grade, 450, 300); } else{ textSize(10); fill(240, 220, 0); text("Your Score: "+grade, 10, 350); } } void gameStart(){ //player.play(); image(imgBG ,0,0,1000,700); image(net, 50, 200); image(Curry01, ballX, 600); fill(200,80,80); ellipse(ballX,ballY,50,50); textSize(30); float time = timeCount/100 ; text("Time"+ time ,500,100); timeCount--; if(timeCount<0) { gamestart = false; gameover= true; //player.close(); //minim.stop(); super.stop(); } if(ballX>97 && ballX<173 && ballY<275 && ballY>225 ){ grade++; } text("Score : "+grade , 500,150); if(flying==true){ ballX+=ballVX; ballY+=ballVY; ballY+=G; i++; if(i>5) isflying = true; } if(isflying){ ballX+=counflyX; ballY=ballY+counflyY; counflyY+=G; i1++; if(i1>200){ counflyX =0 ; counflyY = 0; i1 = 0; } } } void mouseClicked() { if(gameover==true&&gamestart==false){ grade=0; gameover=false; frameCount=0; setup(); redraw(); gamestart=true; } if(gamestart==false){ gamestart=true; } } void JudgeFlying(SkeletonData _s, int _j1,int _j2, int _j3){ if(gamestart==false){ gamestart=true; } v1=PVector.sub(_s.skeletonPositions[_j3],_s.skeletonPositions[_j2]); v2=PVector.sub(_s.skeletonPositions[_j2],_s.skeletonPositions[_j1]); ballVX = (_s.skeletonPositions[_j2].x-_s.skeletonPositions[_j3].x); ballVY = (_s.skeletonPositions[_j2].y-_s.skeletonPositions[_j3].y); float angle=degrees(PVector.angleBetween(v1, v2)); if(angle>=0 && angle<=0.07 &&ballVX<0.3&&ballVY<0.3/*&& isflying == false*/){ image(Curry02,900, 600); if(i<=5){ flying=true; float len=mag(ballVX, ballVY); ballVX = ballVX/len*x; ballVY = ballVY/len*x*1.2; if(i==5){ counflyY = ballVY; counflyX = ballVX; float len2=mag(counflyX,counflyY); counflyX = counflyX/len2*x; counflyY = counflyY/len2*x*1.2; } } } else if (angle <= 180&& angle >= 175 ){ image(Curry01, 900, 600); i=0; i1=0; ballX=900; ballY=600; counflyX =0 ; counflyY = 0; } } void mouseDragged(){ ballX=mouseX; ballY=mouseY; } void mousePressed(){ flying=false; } void drawPosition(SkeletonData _s) { noStroke(); fill(0, 100, 255); String s1 = str(_s.dwTrackingID); } void drawSkeleton(SkeletonData _s) { JudgeFlying(_s, Kinect.NUI_SKELETON_POSITION_WRIST_RIGHT, Kinect.NUI_SKELETON_POSITION_ELBOW_RIGHT, Kinect.NUI_SKELETON_POSITION_SHOULDER_RIGHT ); } void appearEvent(SkeletonData _s) { if (_s.trackingState == Kinect.NUI_SKELETON_NOT_TRACKED) { return; } synchronized(bodies) { bodies.add(_s); } } void disappearEvent(SkeletonData _s) { synchronized(bodies) { for (int i=bodies.size ()-1; i>=0; i--) { if (_s.dwTrackingID == bodies.get(i).dwTrackingID) { bodies.remove(i); } } } } void moveEvent(SkeletonData _b, SkeletonData _a) { if (_a.trackingState == Kinect.NUI_SKELETON_NOT_TRACKED) { return; } synchronized(bodies) { for (int i=bodies.size ()-1; i>=0; i--) { if (_b.dwTrackingID == bodies.get(i).dwTrackingID) { bodies.get(i).copy(_a); break; } } } }

2015年6月29日 星期一

Week 17

期末作品 - 足球守門員

import SimpleOpenNI.*;
import ddf.minim.*;

AudioPlayer player;
AudioPlayer gear;
Minim minim;
SimpleOpenNI openni;

PImage imgBG;
PImage imgBlue;
PImage imgStart;
int score=0;

void setup() {
  size(800,600, P3D);
  imgBG = loadImage("15043987.jpg");
  imgStart = loadImage("123.png");
  imgBlue = createImage(640, 480, ARGB);
  openni = new SimpleOpenNI(this);
  openni.enableDepth();
  openni.enableUser();
  openni.enableRGB();
  minim = new Minim(this);
  player = minim.loadFile("sl.mp3");
  player.play();
}

float ballX0=250, ballY0=100, ballZ0=0, ballX2=350, ballY2=200, ballZ2=300;
//float ballX0=400, ballY0=300, ballZ0=0, ballX2=320, ballY2=240, ballZ2=100;
float t=0;

void draw() {
  openni.update();
  image(imgBG, 0, 0, 800, 600);
  image(openni.rgbImage(), 0, 0, 120, 90);//position
  image(openni.userImage(), 0, 90, 120, 90);//position


  PImage imgUser=openni.userImage();
  imgUser.loadPixels();
  imgBlue.loadPixels();

  for (int i=0; i<640*480; i++) {
    if (imgUser.pixels[i]==color(0, 0, 255)) imgBlue.pixels[i] = color(255, 128, 128, 200);
    else imgBlue.pixels[i]=color(128, 128, 128, 0);
  }

   if(state==2){
     image(imgStart, 0, 0, 800, 600);
    if(keyPressed==true){
     state-=2;
    }
   }
 

   else if (state==0) {

    //copy
    imgBlue.updatePixels();
    //image(imgBlue, 40, 250, 600, 300);//pink people
    image(imgBlue,100, 250, 600, 300);
    pushMatrix();
    noStroke();
    lights();
    float ballX = lerp(ballX0, ballX2, t);
    float ballY = lerp(ballY0, ballY2, t);
    float ballZ = lerp(ballZ0, ballZ2, t);
    translate(150, 270);
    translate(ballX, ballY, -24+ballZ);
    sphere(30);
    popMatrix();
    text("Score:" + score, 350, 100);
    textSize(25);

    t+=0.01;

    if (state!=1 && t>=1) {
      newBall();
      //score--;
      t=0;
    }

    if (t>=0.99) {
      hit(ballX, ballY);

      println(score);
    }
  }
 
   else if (state==1) {

    textSize(100);
    fill(255, 0, 0);
    text("GAME OVER", 100, 100);

    text("SCORE:"+score, 200, 200);
  }
}

void newBall() {
  ballX2 = random(640);
  ballY2 = random(480);
}

int state = 2;

boolean hit(float x, float y) {
  int yy=(int)y*480/270;
  int xx=(int)x*640/500;
  imgBlue.loadPixels();
  gear = minim.loadFile("067.mp3");
  gear.play();
  if (imgBlue.pixels[yy*640+xx]==color(128, 128, 128, 0)) {
    //dead
    state++;
    t=0;
    //score-=1;
    return true;
  } else {
    score++;
    return false;
  }
}

期末作業進度1---圖片設計

《期末作業進度1---圖片設計》

1.做遊戲背景:
我們的遊戲背景是充滿夏天氣息的海邊,
並且和本來就不能動的桌子跟水果機的下半部做結合。
所以其實桌子和水果機下半部是自己組合的。


---------------------------------------------------------------------------------------------

2.做水果攪拌時的圖片:
因為我們水果放進果汁機後,要進行攪拌,
攪拌時要有果汁的水在攪拌,
但又不能蓋住水果,
所以要加透明度。








因為要左右攪拌,所以分別作左右邊,也加透明度了。

------------------------------------------------------------------------------------

3.製作出的果汁種類:
我們分為三種果汁--->綠色,紅色,橘色
果汁的結果不是隨機的,
是經過一些搭配,有對應的結果。


綠色


橘色



紅色




但如果超過四樣水果,
會有隱藏版結果--->波蜜果菜汁。
這是健康的口味~~~哈哈

圖片全部都去背了。


---------------------------------------------------------------------------------------------------

4.手跟腳:
因為要偵測到手部(左手+右手)跟頭部,
在遊戲中是顯示出左手、右手、頭部的三種圖片。
但為了不失可愛又清爽的風格,
所以找的圖片非常符合本次風格。


頭部

右手



左手


是不是非常可愛啊~~~
圖片都已經去背了。

------------------------------------------------------------------------------------

5.遊戲音效:
音樂(1)遊戲背景音效想要有海邊海浪的拍打聲,
和夏威夷風格的音樂,
所以分別找了海浪拍打聲和夏威夷的一首歌
用威力導演將兩首歌接在一起
因此就有兩個混合的音樂囉。

音樂(2)遊戲結果的音效
就是果汁製作完成後的音效。


音樂當天DEMO再播放了。


Week17

Week17期末作品



遊戲起始畫面:

將雙手舉高, 開始遊戲




 遊戲中畫面:






球在中間






球向左






球向右






action:


start game        =>hands above head








restart game     =>right hand to the left of head






stop game        =>left hand to the right of head







forward           =>hands up and lean forward







backward        =>hands up and lean backward







left                  =>hands up & right hand above left hand







right                =>hands up & left hand above right hand







hope                =>hands behind head









 期末作品demo影片:


 2015.0629 體感互動 final project demo - 平衡跳跳球







2015.0629 體感互動 class demo - 平衡跳跳球 







2015.0629 體感互動 class demo photo:



class demo:




volunteer play game:




classmate share each other's game:




team selfie:


2015年6月27日 星期六

01160873_林瑋真

PImage imgman; PImage imgbird; PImage imgbg; float angle=0, manX=131, manY=464, vel=1, dX=0, dY=0; float bird1X[] = new float [1000]; float bird1Y[] = new float [1000]; float bird2X[] = new float [1000]; float bird2Y[] = new float [1000]; int barrier[] = new int [1000]; int manH=226, manW=143; void setup() { size(262, 464, P3D); imgbg=loadImage("BG.png"); imgman=loadImage("man.png"); imgbird=loadImage("bird.png"); for (int i=0; i<100; i++) { barrier[i] = int (random(0, 4)); } for (int i=1; i<100; i++) { bird1X[i] = int (random(30, 50)); bird1Y[i] = -10 * int (random(1, 1000)); bird2X[i] = int (random(212, 232)); bird2Y[i] = -10 * int (random(1, 1000)); } imageMode(CENTER); } int toSmaller=0; int toBigger=0; void draw() { background(imgbg); imageMode(CENTER); pushMatrix(); translate(manX, manY); rotateZ(angle); image(imgman, 0, -30, manH, manW); popMatrix(); dX-=vel*cos(angle); dY-=vel*sin(angle); for (int i=0; i<100; i++) { if (barrier[i]==1) { image(imgbird, bird1X[i], bird1Y[i]+=0.8, 40, 40); //print(bird1X[i]+","+bird1Y[i]+","+manX+","+manY); if(bird1X[i]+20>=manX-65 && bird1Y[i]+20>=manY-60 ) { print("birdtouch"); bird1X[i]=-100; bird1Y[i]=-100; } } if (barrier[i]==2) { image(imgbird, bird2X[i], bird2Y[i]+=0.8, 40, 40); } } if (toSmaller>0) { toSmaller--; manH-=1; manW-=1; } if(toSmaller==1) { for(int i=1;i<80;i++) { manH+=1; manW+=1; } } } void keyPressed() { switch(keyCode) { case RIGHT : angle+=1/100.0; break; case LEFT : angle-=1/100.0; break; case DOWN : toSmaller=80; break; } if (angle>=1/1.5||angle<=-1/1.5) print("DEAD"); if (angle>=1/25||angle<=-1/25) manY-=0.5; }

進度

面臨問題: 人的圖片要漸漸縮小在變回來

尋求老師協助後:

運用"if"來判斷是否要繼續減1,使圖片漸漸變小

if (toSmaller>0) { toSmaller--; manH-=1; manW-=1; } if(toSmaller==1) { for(int i=1;i<80;i++) { manH+=1; manW+=1; }

toSmaller=80;











2015年6月15日 星期一

Week17 01160023 鄒昀燕

加入了音檔  kenji Wu

遇到怪物掉不下來的問題
(顯現不出....)再研究






week17

做出會旋轉的不倒翁,也製作好了人的向前移動方式
卡在不知道如何將不倒翁的每一次都回到最一開始
所以可能要放棄這個計畫
import saito.objloader.*;
PImage imgRoom;
float angle=0,dX=800,dY=600;
float rotY; 
OBJModel model ;

void setup(){
  size(800,600,P3D);
  imgRoom=loadImage("room.jpg");
    model = new OBJModel(this, "NoDaoWon.obj", TRIANGLES);
    model.enableDebug();

    model.scale(20);
    model.translateToCenter();
}
void draw(){
  background(255);
  pushMatrix();
    imageMode(CENTER);
    image(imgRoom,400,300,dX,dY);
    
    translate(width/2, height/2, 0);
    rotY=millis()/500.0;
    rotateY(rotY);
    model.draw();
    
  popMatrix();
}
void keyPressed(){
  if(keyCode==LEFT||keyCode==RIGHT){dX*=1.1;dY*=1.1;}
}

WEEK17 期末作品最後修改完成

把期中的期中作品進行最後修改
換過了所有的圖片跟音樂和背景
用Processing搭配FAAST的Gesture
讓體感可以順利完成




今日進度

    FAAST

我的FAAST的手勢是:

1.left   左移:當左手低於右手 滑鼠事情往左移 遊戲當中的狗狗就會隨著滑鼠左移而移動

2.right 右移:當右手低於左手 滑鼠事情往右移 遊戲當中的狗狗就會隨著滑鼠右移而移動

3.start  開始:當跳的時候 觸發鍵盤事情按下"   "(空白鍵) 遊戲就會開始


    Processing

Processing:
藉由期中作品進行修改
把兩者結合完成!!!!!



目前進度完成90%
只要把一些小細節再進行修改完成即可!!!

week17

確立移動方式和方法

一定要用loop,不然取代鍵盤時會有問題
四種移動(前.後.左.右.)
1.右手舉超過頭>>向右
2.左手舉超過頭>>向左
3.身體前頃>>向上
4.身體後頃>>向下

@FAAST裡的移動雖是取代鍵盤功能,但執行時卻可能不是鍵盤的移動方向!!
當人多時,在判斷姿勢上,會優先抓取第一順位的姿勢移動


計分和計時顯示

期末作業-進度

Let's share color!

構思
在Youtube找到影片:
2011大葉大學14屆視傳系形象長片-視界交互【點點人3主打】
https://www.youtube.com/watch?v=_8E6w0irTQE






看到這個影片產生了將它做成互動軟體的想法,偵測到人利用圓點印出,能多人一起使用,每個人都能有自己的顏色,並且能分享自己的顏色給對方





設計過程:

開始步驟:
  1. 如何印出點點人?
  2. 人如何有顏色?
  3. 如何互相變顏色?




步驟1.印出點點人






步驟2.人如何有顏色
先用矩陣宣告顏色

color[]       userClr = new color[]{ color(255,0,0),
                                     color(0,255,0),
                                     color(0,0,255),
                                     color(255,255,0),
                                     color(255,0,255),
                                     color(0,255,255)
                                   };


將人物的點點填入顏色
  blob_array[index] = 5; //矩陣裡六個顏色
        //fill(GRAY);  這邊是原本還沒加入彩色時先令他為灰階
         fill(userClr[ (userMap[index] - 1) % userClr.length ], 50);  //填入顏色矩陣的色彩

預設第一人為紅色

偵測到第二個人
預設第二人為綠色


第三人為藍色,第四人為黃色,第五人為紫紅色,第六人為淡藍色。









步驟3.如何互相改變顏色?
Let's share color!



當紅色的人碰到綠色的人時,碰到的部分會變成紅色,慢慢地整個人會變成紅色。
當紅色的人不再接觸後,原本的綠色人會變成紅色,而原本紅色的人會變成下一個顏色。











這就是分享顏色!!!!!!!!