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月30日 星期二

Week 18 期末作品

遊戲名稱:足球守門員

操作方式:遊戲一開始會有Start的圖示,之後按任意鍵即可開始遊戲,開始遊戲之後會偵測到粉紅色的畫面,畫面就是守門員的動作,然後利用身體去擋下白色的球,每擋下一球就得一分,失誤一球就結束遊戲。

遊戲畫面:



遊戲一開始的畫面




遊戲中守門員的畫面




遊戲結束畫面




2015年6月29日 星期一

期末作品DEMO

-------------------------------↓↓期中作品DEMO影片↓↓-------------------------------

期末demo影片

LET'S SHARE COLOR!

期末Demo影片

WEEK18 期末作品展示

說明:

把期中的期中作品進行最後修改
換過了所有的圖片跟音樂和背景
用Processing搭配FAAST的Gesture
利用Connect達到體感遊玩小遊戲!

首先利用Connect的體感偵測裝置
可以用來捕捉人的骨架
使用Processing的語言來寫程式
我們寫了一個打磚塊的小遊戲
利用碰撞偵測的方式
把遊戲中的小球當作碰撞點
我們用一隻狗的圖片當作打磚塊下面一動的板子
上面是狗骨頭的圖片
利用小球去碰撞
消掉狗骨頭
直到消完上面一排狗骨頭就算過關
接下來每關都是增加一排狗骨頭
第二關兩層、第三關三層......以此類推

最後搭配FAAST可以把Connect的骨架顯示出來
還可以自己寫控制的手勢
左邊的手高於右邊的手就會使得狗狗向右移動
右邊的手高於左邊的手就會使得狗狗向左移動
不小心GAME OVER 也可以不用去動滑鼠或者鍵盤
只要輕輕跳一下就可以讓遊戲重新開始



操作方式:

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

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

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


遊戲進行:

接下來就是遊戲進行中的截圖
還有一段期末作品的影片




心得:

謝謝小葉老師這學期以來的教導
老師真得很用心~~~~~~~
目的就是想要讓我們
每個同學都能學到一些體感的裝置使用
每節課都有新的例子可以學習
這也讓我們在期中期末的作品呈現上
有非常大的幫助
所以很感謝小葉老師
讓我這學期收穫豐富!!!

期末作業遊戲程式寫法



step1:先宣告變數



step2:將圖檔匯入程式黨裡
ps.圖要拉近data資料夾中


先將會用到的變數設為0



用control決定每個動作
control1為上
2為左
3為右
4為下




health為生命
共有五個 
失誤一次減少一個生命



使用random使箭頭隨機放下





使用n1~n5寫入分數
分別為
個十百千萬



以上是每個分數的圖檔




加入鍵盤按鍵
s為下
d為右
w為上



利用FAAST偵測骨架與做判斷

其中
W(上):右手需高於頭部15公分
S(下):右手需低於軀幹15公分D(右):右手需比軀幹右30公分


PS.玩的時候要快狠準,否則太慢的話會一直偵測測到一樣的 這樣就會容易疏






以上是我們的遊戲!!!!!!!!!!!!!!!!!!!!