2015體感互動
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日 星期一
WEEK18 期末作品展示
說明:
把期中的期中作品進行最後修改
換過了所有的圖片跟音樂和背景
用Processing搭配FAAST的Gesture
利用Connect達到體感遊玩小遊戲!
首先利用Connect的體感偵測裝置
可以用來捕捉人的骨架
使用Processing的語言來寫程式
我們寫了一個打磚塊的小遊戲
利用碰撞偵測的方式
把遊戲中的小球當作碰撞點
我們用一隻狗的圖片當作打磚塊下面一動的板子
上面是狗骨頭的圖片
利用小球去碰撞
消掉狗骨頭
直到消完上面一排狗骨頭就算過關
接下來每關都是增加一排狗骨頭
第二關兩層、第三關三層......以此類推
最後搭配FAAST可以把Connect的骨架顯示出來
還可以自己寫控制的手勢
左邊的手高於右邊的手就會使得狗狗向右移動
右邊的手高於左邊的手就會使得狗狗向左移動
不小心GAME OVER 也可以不用去動滑鼠或者鍵盤
只要輕輕跳一下就可以讓遊戲重新開始
操作方式:
把期中的期中作品進行最後修改
換過了所有的圖片跟音樂和背景
用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.玩的時候要快狠準,否則太慢的話會一直偵測測到一樣的 這樣就會容易疏
以上是我們的遊戲!!!!!!!!!!!!!!!!!!!!
訂閱:
文章 (Atom)