2012年12月19日 星期三

Week15, HW12,




  本周專心於探討將期中的processing作品如何和arduino做結合的部分,我們的期中作品是利用空白鍵控制挖洞穴的小人不一直掉下來得以前進,將原本利用空白鍵來控制的部分改用數字鍵2,希望可將此訊息傳到arduino中,將我們製做好的按鈕可以取代鍵盤來實作。

  日後更希望可以將重新開始遊戲的按鍵也能夠讓我們做的第二顆按鈕取代,而其中困難的部分將是思考如何將processing所傳送的按鍵訊息讓arduino收到並得以實踐。


程式碼



import processing.serial.*;
Serial myPort;

int testState=0;

int cfg_width =450;
int cfg_height = 450;
int cfg_maxchange = 5;
float cfg_space_mod = 0.9994;
int cfg_playersize = 5;
float cfg_gravity = 1.0002;
PImage body;

float dir = 1;
long score = 0; //分數
long maxscore = 0; //最高分紀錄
int push = 0; //按空白鍵增加
int mode = 1;
float cur_space = 450;
float factor = 0.5;  

// the cave borders
int[] ylinetop = new int[cfg_width];
int[] ylinebottom = new int[cfg_width];

// the player (snake)遊戲的線
float[] yplayer = new float[cfg_width/2];

PFont myFont;

import ddf.minim.*;
Minim minim;
AudioPlayer player;


void initcave() {
 
  // game variables
  score = 0;
  dir = 1;
  push = 0;
  cur_space = 400;
 
  body=loadImage("bodyknife.png");
 
 

  for(int i = 0; i < width; i++) {
    ylinetop[i] = height/2-int(cur_space)/2;
    ylinebottom[i] = ylinetop[i]+int(cur_space);
  }

  for(int i = 0; i < width/2; i++) {
    yplayer[i] = height/2;
  }
}


void drawframe () {

    drawframe2 ();//我寫的背景變色程式

   stroke(255,0,0);
 
  for(int i=1; i<width; i++) {  
    line(i, 0, i, ylinetop[i]);
    line(i, ylinebottom[i], i, height);

  }

  if (mode < 1) {
    stroke(0,255,0);
    strokeWeight(5);
    fill(100,255,0);
    ellipse(width/2, yplayer[width/2 - 1], 150, 150);
  }
     people();
}
//背景變色程式在這邊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  void drawframe2 () {
  if (score/10<10){//因為他計分我發現他是score有除以10 所以這邊也要把分數除10才會跟顯示的計分看起來一樣
  background(0,0,0);//小於10分
  }
  else if (score/10<=50) {
    background(0,0,255);//大於10分小於等於50分

  }
  else  if (score/10<100){
  background(255,255,255);//大於等於50分小於100分
  }
   else  if (score/10>=100){
  background(255,255,255);//大於等於100分
  }
 //要把所有數值的情況考慮進去,不然畫面會閃一下。例如原本是小於100 和大於100 沒有寫道等於100的情況 那100分的時候遊戲畫面會閃一下
}

void people(){//小人改變大小
  for(int i=1; i<width/2; i++) {  
  if (score/10<50){
     image(body,i, int(yplayer[i]),80,80);
  }
  else if (score/10<=100) {//大於50分 小於等於100分
     image(body,i, int(yplayer[i]),60,60);

  }
  else  if (score/10<150){
     image(body,i, int(yplayer[i]),30,30);//大於100分小於150分
  }
  else  if (score/10>=150){
     image(body,i, int(yplayer[i]),30,30);//大於等於150分
  }

  }

}


void setup()
{
 
 
  size(cfg_width, cfg_height);
  myPort= new Serial(this,"COM3",9600);
  initcave();
  frameRate(100);
 
  minim = new Minim(this); //播音樂
  player = minim.loadFile("Kalimba.mp3");  //播音樂
 // player.play();  //播音樂
//  myFont = loadFont("SansSerif-12.vlw");
 // textFont(myFont);
}



void drawscore()
{
  stroke(0);
  strokeWeight(3);
  fill(0);
  text("最高分紀錄: " + int(maxscore/10) + "  分數: " + int(score/10), 1, 12);//計分都有除10在這~~~~~~~~~~~~~~~~~~~
 
  // when lost tell the player how to restart
  if (mode == -1) {
    text("Game Over!再玩一次.", 2, 26);
  }
}

void draw()
{
  println(testState);
   while(myPort.available()>0){
    testState = myPort.read();
    print(testState);
  }

 if (mode == 1) {

  for(int i = 1; i < width; i++) {
    ylinetop[i-1] = ylinetop[i];
    ylinebottom[i-1] = ylinebottom[i];
  }
 

  for(int i = 1; i < width/2; i++) {
    yplayer[i-1] = yplayer[i];
  }
 

  ylinetop[width-1] =
    constrain( int( random(-cfg_maxchange, cfg_maxchange) + factor)
                 + ylinetop[width-1]
              , 0, height-int(cur_space+1));
             
  ylinebottom[width-1] = ylinetop[width-1] + int(cur_space);
 
 

  dir = pow(cfg_gravity, dir) * dir;
 

  yplayer[width/2-1] = constrain(yplayer[width/2- 2] * dir, 1, height-2);
 
 

  if (yplayer[width/2-1] < ylinetop[width/2] ||
      yplayer[width/2-1] > ylinebottom[width/2]) {
    mode = 0;
  }

  cur_space *= cfg_space_mod;

  score += 1;

  if (ylinetop[width-1] < 2 || ylinebottom[width-1] > height-2) {
    factor *= -1;
  }
   
 } else {  // collision detected
   if (mode == 0) {
     // save new max score
     maxscore = maxscore > score ? maxscore : score;
   
     mode = -1;
   }
 }
 
 drawframe();
 drawscore();
 
}


void keyPressed() {
 

  if (mode == 1 && key == '1') {
    dir *= 0.997;
  }


  if (mode == -1 && (keyCode == ENTER || keyCode == RETURN)) {
    mode = 1;
    initcave();
  }
 
}

2012年12月18日 星期二

00葉正聖老師, Week15, HW12

1. 繳交校外教學心得報告 1頁半 Word檔
(沒有去的同學,就自行寫份實作期末作品的報告)
2. 今天專注在期末作品的實作
Week 15
Week 16
//Week 17
Week 19 (期中考後星期一下午繳交)
3. 今天要教 Arduino Button 對映 Processing 中,做對映的畫面
4. 老師挑選幾個作品進行實作示範
4.1. Processing 做

Week15,Hw12

1.1 如何將 ArduinoInput 與 期末作品做結合

想法:
 1.將期中作品的鍵盤按鍵,改制成使用Button輸入。或是稍微做一些改變,將遊戲玩法改成類似於吉他,必須事先按下對應的區域,然後使用紅外線感測當作琴弦。

 2.製作跳舞機,但不是使用雙腳,而是使用數個紅外線感測器,然後螢幕上游標到對應區域時,利用雙手伸到對應位置。

 3.將數個感應器,包括水銀、按鈕以及紅外線感測,製作二個手套,利用雙手不同的位置以及特定姿勢,製作一個許多小遊戲的組合。

 4.將Arduino與process以及opencv做結合,搭配opencv人臉偵測以及像素處裡,配合水銀感測製作比較精準的互動視訊。能夠將不同的帽子(眼鏡)結合到當下視訊,利用手部控制。

進度:
 今天練習時,欲先熟練Arduino Input,故選擇其中作業來做一些修正,將其按鈕改為使用Button輸入。目前已經完成,只是感覺太過簡單、敷衍,故址當作練習。

心得:
 Java本身其實是支援許多openSource的函式庫,而Processing又是基於java所產生的語言,在使用的時候其實有很大的自由度,但需要的是足夠的創意,否則又只是一個敷衍了事的產物。而使用opencv的想法,是覺得如果能夠有視訊,並與視訊互動,再搭配Arduino的按鈕。從頭到尾完全不需要鍵盤、滑鼠,只需要看著螢幕,做一些動作就能產生對應的效果及反應。這感覺不是很酷嗎?
 一直覺得在現在的科技上、產品上,最主要的都是在講求與人的互動性,所以我希望在這一次的期末作品中,不論各個部分所應用的多少,或是硬體用的多好,我是希望能夠有很好的、足夠的互動性。

Week15, HW12



我們要做一個迷宮,用Aduino的四個按鍵作前後左右的控制

Week 15, HW12


一、期末作品主題

期中時是做射擊酒瓶的遊戲,用滑鼠點擊移動中的酒瓶,並在限定的時間裡看可以得到多少分數。期末也打算做射擊方面的遊戲,但是會全部從新開始,我們想要做直升機的攔截遊戲,搭配arduino 的按鍵做出射擊的動作。

 

二、期末作品描述

直升機攔截遊戲,場景是銘傳大學,會讓直升機去攔截飛彈,畫面中會有從不同地方出現的飛彈,想轟炸我們美麗的校園。主要要搭配Arduino 的上、下、左、右 跟射擊鍵,操控直升機射擊出飛彈,來抵消從上方出現的飛彈,成功防禦我們的校園。當然期中時有做的功能,倒數計時、記分都會繼續保留,我們打算另外加上,如果沒有抵擋成功,使校園被炸到的話,會有失敗的畫面產生。

 

三、作品所需素材

畫面素材:

開始畫面












移動直升機













轟炸用飛彈






四、心得
後來跟老師討論過後,如果只做上下左右的按鈕再加一顆射擊鍵,這樣不如直接用鍵盤完還來的方便快速,因此後來稍稍的做了修改,可能會加入搖桿的功能,或是上下的功能改成用腳踏! 仿照值生機的內部操作。



hw11,week13

1.

2.小蜜蜂
   533
   422
   1234555
   533
   422
   13551

3.int buttonPin = 2;
int buttonPin3 = 3;
int buttonPin4 = 4;
int buttonPin5 = 5;
int buttonPin6 = 6;
int buttonState = 0; 
int buttonState3 = 0; 
int buttonState4 = 0; 
int buttonState5 = 0; 
int buttonState6 = 0; 
void setup() {
  pinMode(buttonPin, INPUT);    
  pinMode(buttonPin3, INPUT);    
  pinMode(buttonPin4, INPUT);    
  pinMode(buttonPin5, INPUT);    
  pinMode(buttonPin6, INPUT);    
}
void loop() {
  buttonState = digitalRead(buttonPin);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);
  buttonState5 = digitalRead(buttonPin5);
  buttonState6 = digitalRead(buttonPin6);
 
  if (buttonState == HIGH) {    
   tone(8, 131, 10);
  }

  if (buttonState3== HIGH) {    
   tone(8, 147 , 10);
  }

  if (buttonState4 == HIGH) {    
   tone(8, 165 , 10);
  
  }

  if (buttonState5 == HIGH) {    
   tone(8, 175 , 10);
  }

  if (buttonState6 == HIGH) {    
   tone(8, 196, 10);
  }
}

Wee13,HW11

01.將Arduino做出的鋼琴錄影上傳到youtube,再貼回部落格


02.發揮你的創意做出最特別的音樂

~~音樂 : 小蜜蜂~~
03.貼上程式碼

const int inPin1 = 7;
const int inPin2 = 6;
const int inPin3 = 5;
const int inPin4 = 3;
const int inPin5 = 2;
int val1 = 0, val2 = 0, val3 = 0, val4 = 0, val5 = 0;
void setup() {
   pinMode(inPin1, INPUT);
   pinMode(inPin2, INPUT);
   pinMode(inPin3, INPUT);
   pinMode(inPin4, INPUT);
   pinMode(inPin5, INPUT);
}
void loop() {
   val1 = digitalRead(inPin1);
   val2 = digitalRead(inPin2);
   val3 = digitalRead(inPin3);
   val4 = digitalRead(inPin4);
   val5 = digitalRead(inPin5);

      if(val1==HIGH){
         tone(8,524,8);
      }
      if(val2==HIGH){
         tone(8,588,8);
      }
      if(val3==HIGH){
         tone(8,660,8);
      }
      if(val4==HIGH){
         tone(8,698,8);
      }
      if(val5==HIGH){
         tone(8,784,8);
      }
}

心得:
這次在課堂上做了"1 2 3 4 5 "五個音階,但是我們按"2"的按鈕,發出來的聲音聽起來有點分岔,不是很悅耳。電線經過幾次的調整後,"2"的音終於比較正常了,但是"3"的音卻怪怪的,索性我們跟別組借了按鈕,五個音階終於正常了。

影片中的音樂是"小蜜蜂"。