顯示具有 99161144王靚暄 標籤的文章。 顯示所有文章
顯示具有 99161144王靚暄 標籤的文章。 顯示所有文章

2013年1月15日 星期二

Week19,final,project

作品名稱:划船遊戲

1. 遊戲進行及裝置介紹

首先是開頭畫面



再來是進入到遊戲畫面



然後努力滑要到終點了 ! !



















如果在時間內趕上終點  你就贏了

就會顯示贏的畫面




















如果沒辦法就會顯示輸的畫面



















這是我們 arduino 的裝置圖 - 划船裝置




這張是裝置的內部

是採用彈簧與桿子的槓桿原理做出划船力道的模擬








我們把按鈕黏上彈簧讓控制時需要力道才能順利案到按鍵

然後利用保麗龍塊固定按鈕位置


















接者是控制示意圖



























下面是遊戲進行畫面 方向示意圖

右上角是剩餘時間





















2. 遊戲玩法說明

        當畫面一開始,就按下紅色開始鍵開始遊戲,雙手放在桿子上,模擬划船的槳
當手往前推動,遊戲畫面中的船就會往該方向前去,而在 30 秒內要到達終點
如果 30 秒內抵達就是任務達成,否則就是任務失敗遊戲結束


3. 心得

        這個划船遊戲能夠完整的利用裝置來操控,真的是非常的幸運
在整個遊戲作品的製作過程中,遇見了許許多多的問題,有和一些同學們共同討論解決
謝謝他們提供的建議和解決方式,也謝謝助教建議的軟體與硬體操控的方向 :)

         在完成裝置之前都是理想中的設計裝置,製作過程中便是狀況一堆
不僅僅是按鈕和搖桿的結合,再加上 arduino 接線、程式撰寫等等搭配,遇到的問題真不少
尤其是裝置的方形按鈕與接線處頻頻出錯,一下是按鈕壞掉接觸不良,一下是接線鬆掉
後來嘗試用了課堂上做的小鋼琴按鈕,結果卻是如我們預期的控制船的方向移動

        但這樣就要捨棄掉利用桿子進行操控裝置的方法,讓我們非常挫折與無奈
也因為捨棄掉操控裝置的方法可惜,我們不斷地的嘗試,看還有甚麼方式能補救
運氣很好的,在我們裝上小按鈕,再接上方形按鈕後卻可以操控了 ! ! ! ! !
划船裝置也在那時候如我們預期成果般地完成,順利地完成 demo
也很感謝同學和老師、助教的肯定,讓我們獲得了獎品,謝謝大家 :D

        很開心這學期學到了這麼多和互動相關的東西,這堂課很充實 :P 
我們從同學、老師、助教身上學到很多寶貴的經驗、程式撰寫技巧以及遊戲設計概念等等
也完成兩個簡單的小作品,雖然這兩個小作品不是非常的完整 ˊ  ˇ  ˋ
但對我們來說是很好的經驗,也讓我們更了解自己不足的地方,希望之後能表現得更好:D

4. 遊戲 demo 影片



5. 作品分工狀況


遊戲作品構思:王靚暄、詹中豪
遊戲背景素材貼圖:王靚暄
遊戲程式:王靚暄、詹中豪
遊戲裝置構思:詹中豪
遊戲裝置製做:王靚暄、詹中豪


6. 程式碼
*processing

import processing.serial.*;
Serial myPort;
PImage sence1;
PImage sence3;
PImage sence4;
PImage ship;
PImage bg;
int W=1000,H=700;
float boatX=320,boatY=100, boatVX=0, boatVY=0;
float bgX=0,bgY=-1232;
int gameTime,s;
boolean ctrl=true;
int lastTime;
import ddf.minim.*; 
Minim minim; 
int testState=0;
AudioPlayer player;


void setup(){
  size(W,H);
  sence1 = loadImage("sence1.jpg");
  sence3 = loadImage("sence3.jpg");
  sence4 = loadImage("sence4.jpg");
  image(sence1,0,0);
  ship = loadImage("ship.png");
  bg=loadImage("bg.jpg");
  s=millis()/1000;
  minim = new Minim(this);
  myPort = new Serial(this,"COM3", 9600); 
   player = minim.loadFile("abdc.mp3");
  player.play();
}

void draw(){
  
  testState = myPort.read();
  println(testState);
  
  if (testState=='G') {
    ctrl=false;
  }
   if(ctrl==true){
    s = millis();
    image(sence1,0,0); 
    } 
    else if(ctrl==false){{
    image(bg, bgX, bgY);
    if (bgY>0)
    bgY=0;
    boat(boatX, boatY);
    boatMove();
    
  }
  
    fill(255,0,0);
    textSize(60);

    lastTime = millis()- s; 
    gameTime = 30-lastTime/1000;  
    text(gameTime,900,70); 
  
  
  
    if(gameTime>0 && bgY==0){
    image(sence4,0,0);
    
    } 
    else if(gameTime <=0){
    image(sence3,0,0);
    gameTime = 0;
    
    }
  
    }
}
boolean [] keys=new boolean[250];
void boatMove() {
  if ( testState == 'A') {
    boatVY-=1;
    boatVX+=1;
    if (boatVX<0)boatVX=0;
    if (boatVY>-0.5)boatVY=-0.5;
  }
  if (testState == 'S') {
    boatVX-=0.5;
    boatVY-=0.5;
    if (boatVX<-1)boatVX=-1;
    if (boatVY>-0.5)boatVY=-0.5;
  }
  
  boatX+=boatVX;
  boatY+=boatVY;
  if (boatY<H/2) {
  bgY-=(boatY-H/2);
  boatY=H/2;
  }
  if (boatX<0) {
    boatX=0;
  }
   if (boatX>600) {
    boatX=600;
  }
  
  if (boatY>650) {
    boatY=650;
  }
  
  
  boatVY*=0.9;
  boatVX*=0.9;
}





void keyPressed() {
 if (testState=='G') {
   ctrl=false;
  }
  else if (testState=='A') {
    boatVY-=1;
    boatVX+=1;
  }
  else if (testState=='S') {
    boatVX-=0.5;
    boatVY-=0.5;
  }
  
}

void keyReleased() {
 if (testState=='A') {
    boatVY=0;
    boatVX=0;
  }
  else if (testState=='S') {
    boatVX=0;
    boatVY=0;
  }
} 

void boat(float X, float Y) {
  image(ship, boatX, boatY);
}



*arduino
/*
DigitalReadSerial
Reads a digital input on pin 2, prints the result to the serial monitor
This example code is in the public domain.
*/
// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton2= 2;
int pushButton3 = 3;
int pushButton4 = 4;
int buttonState2 =0;
int buttonState3 =0;
int buttonState4 =0;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// make the pushbutton's pin an input:
pinMode(pushButton2, INPUT);
pinMode(pushButton3,INPUT);
pinMode(pushButton4,INPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
int buttonState2 = digitalRead(pushButton2);
int buttonState3 = digitalRead(pushButton3);
int buttonState4 = digitalRead(pushButton4);
// print out the state of the button:
if (buttonState2 == HIGH) {     
   Serial.write('A');
  } 
  if (buttonState3== HIGH) {     
   Serial.print('S');
  }
  if (buttonState4 == HIGH ) {     
    Serial.print('G');
    buttonState4 = 1;}

   else {
   Serial.print('H');
  }
   delay(100);
}

2012年12月26日 星期三

Week15,HW12

期末作品進度

作品名稱: 划船遊戲


1、遊戲規則初步想法

利用兩個按鍵不斷輪替按著,讓船有加速度不斷前進,
接著計算其到達終點的時間,讓玩家挑戰最佳時間最短的紀錄。



2、確認作品操控以及進行的方向

我們的想法是由google和逆向思考的小遊戲所結合的,
這周我們討論遊戲的前進控制和玩法,
我們打算利用兩個按鈕控制他的前進方向,
小葉老師有建議我們利用旋鈕來做類似雙渦輪的設定,
但是後來發現,我們利用按鈕簡單的控制物體前進的加速度,
在配合他轉彎X值做加減以及背景地圖的不斷延伸,
就可以讓他有往左前和右前的方向以及速度控制。


3、素材貼圖





























4、心得

在規劃這作品前,我們最擔心的是按鈕的配合,
也就是arduino和processing的連接,因為沒有試過的經驗,
在小葉老師上課的範例中,我們有嘗試著做修改,
arduino是不是可以傳兩個不一樣的值,然後processing可以分別,
但是我們試了很久,還是搞不懂為甚麼他只給我們讀到一個按鈕的訊號,
這是我們這一周所遇到的問題,我們雖然只需要兩個按鍵,
但是這個問題會是我們期末作品最大的一個瓶頸,
所以我想可以馬上解決問題,往完整的作品邁向一大步。















2012年12月4日 星期二

hw11,week13


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

















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


















我們有成功做出鋼琴的五個按鈕,每個按鍵代表每個音階,
然後我們就異想天開的加入了旋鈕想要改變音階的變化,
因為我們認為按鍵數量不夠,不知道能不能利用程式的撰寫,
利用旋鈕來改變按鈕的音階,讓五個按鈕可以各代表兩個音階,
這樣音域就會變廣,我們就朝這個方向邁進,但是最後試出來的結果,
真的讓我們覺得有些小失望,因為改變旋鈕後,它只是改變發聲的頻率,
並不如預期的改變其音階,還有很可惜沒有拍成影片,其實這次失敗的計畫中,
我們有學到旋鈕的配合真正的用處在哪邊,並且了解這樣的方式並不可行。



3.貼上程式碼



*/
#include "pitches.h"

const int buttonPin1 = 3; // the number of the pushbutton pin
const int buttonPin2 = 4; 
const int buttonPin3 = 5; 
const int buttonPin4 = 6; 
const int buttonPin5 = 7; 

const int ledPin = 8; // the number of the LED pin

// variables will change:
int buttonState1 = 0; 
int buttonState2 = 0; 
int buttonState3 = 0; 
int buttonState4 = 0; 
int buttonState5 = 0; 

// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4,4,4,4,4 };

void setup() {
// iterate over the notes of the melody:
// initialize the LED pin as an output:
pinMode(8, OUTPUT); 
// initialize the pushbutton pin as an input:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
pinMode(buttonPin4, INPUT);
pinMode(buttonPin5, INPUT);

for (int thisNote = 0; thisNote < 8; thisNote++) {

// to calculate the note duration, take one second 
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000/noteDurations[thisNote];


// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}

void loop() {
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
buttonState3 = digitalRead(buttonPin3);
buttonState4 = digitalRead(buttonPin4);
buttonState5 = digitalRead(buttonPin5);

// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState1 == HIGH) { 
// turn LED on: 
tone(8,NOTE_C3,4);
digitalWrite(8, HIGH); 
} 


else if (buttonState2 == HIGH) { 
// turn LED on: 
tone(8,NOTE_D3,4);
digitalWrite(8, HIGH); 
} 


else if (buttonState3 == HIGH) { 
// turn LED on: 
tone(8,NOTE_E3,4);
digitalWrite(8, HIGH); 
} 


else if (buttonState4 == HIGH) { 
// turn LED on: 
tone(8,NOTE_F3,4);
digitalWrite(8, HIGH); 
} 

else if (buttonState5 == HIGH) { 
// turn LED on: 
tone(8,NOTE_G3,4);
digitalWrite(8, HIGH); 
} 
else {
// turn LED off:
digitalWrite(8, LOW); 
}

}

4.本周上課心得

今天利用到五個按鈕,做出鋼琴的樣子,其實一開始還是有卡關,
在於程式部分和案件硬體的理解稍微慢了一些些,
硬體的輸出腳以及程式的搭配,要需要小心一點,
因為很容易就被卡住,所以我們這次學到了必須先建立好程式邏輯才開始動手
我們之後練習的步驟就打算利用這樣的做法來試試看,
已有最有效率的方法達到最好的學習成效,
很開心我這周又學到了一點東西。




2012年11月27日 星期二

Week12,HW10


01.將霹靂燈錄影上傳到youtube,再貼回部落格

掃描霹靂燈左右累積







//由右至左單顆累積
if(s==13){
for(int y=0;y<14;y++){
digitalWrite(y+7,HIGH);
digitalWrite(y+1,LOW);
delay(sensorValue);
}


//由左至右單顆累積
if(s==13){
for(int t=14;t>0;t--){
digitalWrite(t-1,HIGH);
digitalWrite(t+5,LOW);
delay(sensorValue);
}



02.發揮你的創意做出最特別的霹靂燈






依照程式的排序是 

由 右至左單顆        → 左至右單顆
→ 右至左隔兩顆     → 左至右隔兩顆
→ 右至左單顆累積  → 左至右單顆累積
→ 由外而內單顆     → 由內而外單顆
→ 由外而內累積     → 由外而內暗燈

03.貼上程式碼

//由左至右單顆亮
if(s==13){
for(int q=13;q>5;q--){
digitalWrite(q,HIGH);
digitalWrite(q+1,LOW);
delay(sensorValue);
}
}

//由右至左隔兩顆亮
if(s==13){
for(int x=0;x<14;x+=2){
digitalWrite(5+x,HIGH);
digitalWrite(5+x-2,LOW); //關掉上一個
delay(sensorValue);
}
}

//由左至右隔兩顆亮
if(s==13){
for(int r=14;r>4;r-=2){
digitalWrite(r,HIGH);
digitalWrite(r+2,LOW); //關掉上一個
delay(sensorValue);
}
}

//由右至左單顆累積
if(s==13){
for(int y=0;y<14;y++){
digitalWrite(y+7,HIGH);
digitalWrite(y+1,LOW);
delay(sensorValue);
}
} 

//由左至右單顆累積
if(s==13){
for(int t=14;t>0;t--){
digitalWrite(t-1,HIGH);
digitalWrite(t+5,LOW);
delay(sensorValue);
}
} 

//由外而內+由內而外
if(s==13){
for(int z=14,c=0;z>0,c<14;z--,c++){
digitalWrite(z-1,HIGH);
digitalWrite(c+7,HIGH);
digitalWrite(z,LOW);
digitalWrite(c+6,LOW);
delay(sensorValue);
}
} 
//由外而內+由內而外累積
if(s==13){
for(int z=14,c=0;z>0,c<14;z--,c++){
digitalWrite(z-1,HIGH);
digitalWrite(c+7,HIGH);
digitalWrite(z+5,LOW);
digitalWrite(c+1,LOW);
delay(sensorValue);
}
} 

//全亮
if(s==13){
for(int x=7;x<14;x++){
digitalWrite(x,HIGH);
digitalWrite(x+1,HIGH);
digitalWrite(x+2,HIGH);
digitalWrite(x+3,HIGH);
digitalWrite(x+4,HIGH);
digitalWrite(x+5,HIGH);
digitalWrite(x+6,HIGH); 
delay(sensorValue/5);
}
}

//全暗
if(s==13){
for(int x=7;x<14;x++){
digitalWrite(x,LOW);
digitalWrite(x+1,LOW);
digitalWrite(x+2,LOW);
digitalWrite(x+3,LOW);
digitalWrite(x+4,LOW);
digitalWrite(x+5,LOW);
digitalWrite(x+6,LOW);
delay(sensorValue/5);
}
}
if(s==13){
for(int x=7;x<14;x++){
digitalWrite(x,HIGH);
digitalWrite(x+1,HIGH);
digitalWrite(x+2,HIGH);
digitalWrite(x+3,HIGH);
digitalWrite(x+4,HIGH);
digitalWrite(x+5,HIGH);
digitalWrite(x+6,HIGH); 
delay(sensorValue/5);
}
} 

if(s==13){
for(int x=7;x<14;x++){
digitalWrite(x,LOW);
digitalWrite(x+1,LOW);
digitalWrite(x+2,LOW);
digitalWrite(x+3,LOW);
digitalWrite(x+4,LOW);
digitalWrite(x+5,LOW);
digitalWrite(x+6,LOW);
delay(sensorValue/5);
}
}


4、本周上課心得

這堂課讓我們接上了LED燈泡,讓我們興奮不已
開始用程式以及旋轉扭利用arduino電路板接縣與我們互動
在一開始上課頻頻卡關的我們,讓我們在課堂中有一些疑惑
因為程式碼跟輸出的東西,跟我們想要出來的東西都不相同
LED一直沒有亮,或者是只亮一顆
在一開始的霹靂燈掃描版本我們就研究了有一段時間
後來下課前由同桌組員們(蕭靖芸、黃慶華)的小提醒
讓我們的程式順利達成第一項由右至左單顆亮的目標
我們利用for迴圈來寫每一之腳所代表的LED
至於一開始卡住的問題,我們後來發現是因為
我們讓每一個LED亮(HIGH),同時也把它變成暗(LOW)
所以我們要控制HIGH 和LOW 不要在同一顆做反應
他就會有順序上的亮和暗的差別,這是我們在做也中學到的事情

2012年11月20日 星期二

Week11,Hw09

第 11 週 Homework

(1) 有了 processing + Arduino 可以做出甚麼?

很多遊戲都是利用鍵盤和滑鼠來操作
透過 processing + Arduino
我們可以不用藉由鍵盤及滑鼠就能玩遊戲
像是下方的影片
就是利用拖鞋和類似跳繩的握把來做打擊、踩踏板的動作
除了可以讓玩的人不再侷限手部上的操作
也能增加遊戲與玩家間的互動性

方塊射擊:可以直接透過手來控制物件的移動方向,用腳來發射子彈射擊

(2) 找 Arduino 影片 -- Arduino Air Drums




透過 Arduino 板與改量式拖鞋、類似跳繩的握把結合
就能變成小型簡單的打鼓裝置
讓家中沒辦法買鼓或是空間太小放不下鼓的人
都可以藉由簡易的打鼓裝置練習打擊點或和朋友一起玩音樂
我覺得這個巧思很棒 :D

(3) 心得感想

我覺得今天這堂課很有趣
除了要在電腦上寫程式外
還可以認識 Arduino 板的簡單構造
之後還透過 Arduino 板與 LED燈、喇叭結合
直接將結果呈現出來我覺得很棒,我很喜歡 :D
雖然我們這組的工具箱沒有學長姐留下來的喇叭裝置
但我們有跑去徐修謙、鍾孟志那邊聽喇叭放出來的音效
超酷的 XD 不過它的聲音好小聲就是哈哈哈
期待下次的課堂內容 ya

2012年11月13日 星期二

Midterm


期中作業:方塊射擊


因為臨時改變遊戲玩法有改
所以題目也有變化

上課的 Demo 影片




問題解決後的 Demo 影片





影片的音樂在錄製的時候有點兒奇怪
我們是從這段影片截取一段音樂使用 ( 從 2 分 42 秒開始 )
點我點我
想聽音樂可以來這裡聽哦 :D

程式碼

int i=0,j=0,k=0;
int [][]grid=new int [10][20]; // 這是一開始俄羅斯方塊的背景陣列
int mapw=20;
int score=0;
int nowX=5,nowY=0;
int backgrounds=1;
PImage startbackground;
PImage tetrisbackground;
PImage endbackground;
PImage pig;
int mx=0,my=0,mxb=0,myb=0;
int angle=0;
int shootx=-25;
int shooty=0;
boolean ctl=true;
int ctl2=0;
int gameTime,s;
int lastTime;
int count;
import ddf.minim.*; 
Minim minim; 
AudioPlayer player;

void setup(){
  size(500,400);
  startbackground = loadImage("sb.jpg");
  tetrisbackground = loadImage("200.jpg");
  endbackground = loadImage("end.JPG");
  pig = loadImage("13771.png");
  image(startbackground,0,0);
  s= millis()/1000;
  minim = new Minim(this);
  player = minim.loadFile("abdc.mp3");
  player.play();
}

void draw(){
  if( mousePressed && mouseX&rt;180 && mouseX<300 && mouseY&rt;280 && mouseY<350 && ctl)
   ctl=false;
   if(ctl==true){
    image(startbackground,0,0); 
    } 
    else if(ctl==false){{
       image(tetrisbackground,0,0);
       int m=grid[i][j];
       for(int i=0;i<mapw*20;i+=mapw){
         for(int j=0;j<mapw*10;j+=mapw){
           fill(70,70,70,10);
             stroke(175,175,175);
             rect(j+50,i,mapw,mapw);       
             }
            }  
      Tt(nowX,nowY,20,20);
      fill(0,255,255);
      shooty=340+count--;
      rec(shootx,shooty);
      if(shooty == (myb)+19 || shootx+10&rt;(mxb+500) && shootx+10< 46+(mxb+500)){
      score+=10;
      }
      image(pig,mxb+50,myb);   
    }
    s= millis()/1000;
    fill(255,0,0);
    textSize(30);
    text(score,440,127);
 
    lastTime = millis()- s; 
    gameTime = 30-lastTime/1000;  
    text(gameTime,400,70); 
  
    if (gameTime<0){
    image(endbackground,0,0,500,400);
    text("Your score is:  " +score,120,350);  
    }
  }  
}

void rec(int x,int y){
  rect(x,y,20,20);
  }

void Lt(int c, int d,int r, int e){
  int lts[][]={{0,0,0,0},
               {1,1,1,0},
               {0,0,1,0},
               {0,0,0,0}};  
     for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(lts[a][b]==1){
          fill(255,0,0);
          rect(a*20,b*20,20,20);
    }
  }
}
void It(int x, int y,int r, int e){
  int its[][]={{1,0,0,0},
               {1,0,0,0},
               {1,0,0,0},
               {1,0,0,0}};  
    for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(its[a][b]==1){
          fill(255,119,53);
          rect(a*20,b*20+80,20,20); // 為了確認方塊有出現先移動 y 軸 +80
    }
  }
}
void Jt(int x, int y,int r, int e){
  int jts[][]={{0,0,0,0},
               {0,0,1,0},
               {1,1,1,0},
               {0,0,0,0}};  
    for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(jts[a][b]==1){
          fill(255,255,0);
          rect(a*20,b*20+120,20,20); // 為了確認方塊有出現先移動 y 軸 +120
    }
  }
}
void Wt(int x, int y,int r, int e){
  int wts[][]={{0,0,0,0},
               {0,1,1,0},
               {0,1,1,0},
               {0,0,0,0}};  
    for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(wts[a][b]==1){
          fill(0,128,64);
          rect(a*20,b*20+180,20,20); // 為了確認方塊有出現先移動 y 軸 +180
    }
  }
}
void Tt(int x, int y,int r, int e){
  int tts[][]={{0,0,1,0},
               {0,1,1,0},
               {0,0,1,0},
               {0,0,0,0}};  
    for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(tts[a][b]==1){
          fill(0,0,255);
          rect(a*20+50+mx,b*20+340,20,20); // 為了確認方塊有出現先移動 y 軸 +240
    }
  }
}
void Zt(int x, int y,int r, int e){
  int zts[][]={{0,1,0,0},
               {0,1,1,0},
               {0,0,1,0},
               {0,0,0,0}};  
    for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(zts[a][b]==1){
          fill(26,133,221);
          rect(a*20,b*20+300,20,20); // 為了確認方塊有出現先移動 y 軸 +300
    }
  }
}
void Nt(int x, int y,int r, int e){
  int nts[][]={{0,0,1,0},
               {0,1,1,0},
               {0,1,0,0},
               {0,0,0,0}};  
    for(int a=0;a<4;a++){
      for(int b=0;b<4;b++)
        if(nts[a][b]==1){
          fill(91,0,183);
          rect(a*20+320,b*20,20,20); // 為了確認方塊有出現先移動 y 軸 +300
    }
  }
}
void keyPressed(){
  if(key==CODED && keyCode==LEFT){ 
    mx-=20;
    if(mx<0)mx=0;
  }
  if(key==CODED && keyCode==RIGHT){
    mx+=20;
    if(mx&rt;140)mx=140;
  }
  if(key==CODED && keyCode==DOWN){
    my+=20;
    if(my&rt;340)my=340;
  }
    if(key=='a'){ 
    mxb-=1;
    if(mxb<0)mxb=0;
  }
  if(key=='d'){
    mxb+=1;
    if(mxb&rt;160)mxb=160;
  }
  if(key==CODED && keyCode==UP){
     count-=20;
     shootx = mx+70;
  }
}
void keyReleased(){
  if(key==CODED && keyCode==UP){
    count=0;
  }
}   





   
這是遊戲開始畫面





這是遊戲進行畫面





這是結束畫面






遊戲玩法:
這個遊戲可以兩個人玩

我方砲台控制分別是
左 :← 右:→  發射 : ↑
敵方物體控制分別是
左 :A  右:D

當我方子彈射擊到敵方物體,則得 10 分
在 30秒 內看我玩家可得到多少分
敵方玩家就只能閃躲,沒辦法射擊子彈



這是我們原本俄羅斯方塊進行的階段





















在一開始的程式碼中
我們已成功寫出了 7 種方塊
以及利用陣列畫出背景方格
但後續要考慮到的狀有點多且複雜
例如:方塊旋轉,位置需對應到正確的背景陣列
或是方塊旋轉時,碰到已堆疊好的方塊,該如何調整位置等等
所以我們後來決定改變遊戲的進行方式


心得感想

        在一開始決定作俄羅斯方塊時,壓根的沒想過他會這麼難,要考慮到很多條件聽老師說夢想中的遊戲都可能實現,讓我們更確定了我們的目標,所以在開始期中作品一開始,我們先討論要先解決甚麼事情。

        介面的設計是我們最一開始的小目標把俄羅斯遊戲畫面的map網格畫出來,在這介面設計上,原本想說單純利用雙層for迴圈來解決,但是我們考慮到後來方塊必須在map網格上判斷是否存在,所以必須將以設定的map網格每一格初始化一個值,雖然我們遊戲邏輯在ㄧ開始有想出來,但是在程式的編寫方面就遇上了難題,我們有到處去問人及上網找解決的方法,但是後來還是老師的初始化方法比較佳且易懂,所以在這初始化map網格上的問題就暫時解決了。

        再來就是方格種類的設定,依照我們的思考後的遊戲邏輯,必須將每一個種類的俄羅斯方塊用二維陣列的方式加他寫出來,並且以布林值去做畫方格設定,在這裡也遇到相同的問題,就是知道目的是要做什麼,但是程式不知該如何撰寫會比較佳對於之後的遊戲流程,所以我們在寫俄羅斯方塊時,都是以當出假設概念一邊實驗一邊修改,在這邊徐修謙同學幫了我們很多的忙,這裡的概念是他建議我們的,之後我們自己去試且成功的利用二維與布林值畫出油四格方型排成的7種類型的俄羅斯方塊。在來就是應用在map中,當初我們試想用亂數呼叫的方式,把7種類型的俄羅斯方塊放入map中,可是在這上面頻頻出現問題,在亂數呼叫時,我們運用了random + swich-cace的概念,這個問題我們還沒有解決,因為亂數值會一直跳,停不下來,所以我們的7種方塊在遊戲畫面中,全部出現並一直閃,我們猜想是亂數值停不了,所以在這上面還有問題沒解決,之後我們問題接二連三的出現,讓我們原本的計畫都被不能執行的程式給打亂了,說真的在這邊我們有點挫折感,這時我們才發現在著手寫程式之前概念必須是正確的才會比較順。

        後來聽了小葉老師的建議,在短時間內我們無法debug完寫出完整的俄羅斯方塊,或許可以以俄羅斯方快轉個彎,加一點小巧思去改變玩法,變成是屬於我們的簡易式的俄羅斯方塊,後來我們想了一下子,利用之前已完成的7種方塊去做變化,一開始想到的改良版是小蜜蜂,但後來發現其實我們可以更簡單一點,而且可以加入兩個人玩的樂趣,就利用之前作的map網格作為我們的砲台面,我的方塊變成檯面中的砲台可以方射方格砲彈,並且將對手變成一隻豬,而上方的豬可以依照2P玩家控制閃躲,而1P玩家則是下方的方塊砲台並可以發射砲彈,而在限時內砲彈碰到豬時分數就會加10分,這是我們在短時間內不斷想以及改造後的結果。然而在改造的過程中也遇到了其他麻煩,像是砲彈發射的位置以及單按鍵觸發後子彈的反應、砲彈碰到豬的觸發分數加分、畫面的更新、開始畫面進入到遊戲畫面、時間結束跳到結束畫面...等,以上都是我們在短時間內克服的問題。

       最後雖然我們做的期中作品不是如預期的那樣,但是我們知道在做一個遊戲時,必須遇到的問題與狀況,在當初評估時並不會想到這麼多問題,所以我們認為我們都經歷了一個很好的學習經驗,在這次的期中作品中我們獲益良多。



2012年10月30日 星期二

Week08, HW08

(1) 之前完成的進度

a. 調整俄羅斯方塊介面設計
b. 用鍵盤控制方向 ( ↑、↓、←、→ )


(2) 第 8 周預期完成進度

a. 每個方塊的旋轉狀態用陣列去宣告
b. 方塊在二維陣列中怎麼和背景貼齊
c. 預計用的背景圖


 










(3) 遇到的問題及可能的解決方法

  a 問題:
           在方塊創立時已經使用二維陣列宣告,
           也把1、0放進去 if 做判斷,
           但是方塊沒有依照1的位置正確填色
           譬如說我的二維陣列是

                      int nts[][]={{0,0,1,0},
                                       {0,1,1,0},
                                       {0,1,0,0},
                                       {0,0,0,0}};


                     for(int a=0;a<4;a++){
                       for(int b=0;b<4;b++)
                      if(nts[a][b]==1){
                      fill(91,0,183);
                      rect(a,b,20,20);

          在呼叫進draw時,只出現一個 rect ,
          正常應該是要由四個 rect 拼成一個 N型的方塊類型。

發現並解決: 
          在 rect 的座標軸要加一個位置值,他就出現 N 型方塊種類
           rect(a*20+320,b*20,20,20);



    b.問題:
             七個俄羅斯的方塊種類 已經設定完畢
              在map (陣列地圖) 的初始值也設定ok

              可是我在draw中隨機呼叫俄羅斯的種類時遇到了問題

              隨機呼叫就是 任意種類的俄羅斯方塊被我呼叫進map中
              利用swich的方式,雖然把所有方塊類型都有亂數跑出來
              但是亂數停不了,所有的方塊在map中都是一閃一閃的

          k=round(random(0)); 
          println(k);

          if(k>=0){
          switch(k){
          case 0:
          translate(110,0+(s/500)*20);
          Lt(270,0,20,20);
          break;
          case 1:
          It(270,0,20,20);
          break;
          case 2:
          Wt(270,0,20,20);
           break;
           case 3:
           Nt(270,0,20,20);
           break;
           }}
          

發現並解決:
             目前還沒有找到方法可以解決這個問題
  


(4)心得:

           在這幾週試著去處理俄羅斯方塊遇到的問題
       發現其實俄羅斯方塊還需要解決的問題還很多
       但是希望我們未來遇到的問題能順利的解決
       在這上面得到成就感



Week07,Hw07

(1) 期中作品進度


a. 調整俄羅斯方塊介面設計
b. 用鍵盤控制方向 ( ↑、↓、←、→ )
c. 方塊旋轉


◎ 第 7 周進度程式碼

a. 俄羅斯介面設計調整

PImage cube;
float angle=0.01;
int mx=300,my=100,rs=300;
void setup(){
    size(500,500);
    cube = loadImage("200.png");
   // background(255,255,255);
  for(int i=0;i<12;i++){    //行個數
  for(int k=0;k<20;k++){  //列個數
    fill(41,205,136,80);
    rect(i*25,k*25,25,25);
  }
}
}
void draw(){
    //background(255,255,255);
    translate(mx-18,my-35);
    rotate(angle);
    translate(-mx-35,-my-18);
    scale(1.2);
    image(cube,mx,my);
}
void keyPressed(){
  if(key==CODED && keyCode==LEFT){
    mx-=20;
    if(mx<0)mx=0;
  }
  if(key==CODED && keyCode==RIGHT){
    mx+=20;
    if(mx>445)mx=445;
  }
  if(key==CODED && keyCode==DOWN){
    my+=20;
    if(my>460)my=460;
  }
   if(key==' '){
   angle++;
  }
 
}




















b. 用鍵盤控制方向 ( ↑、↓、←、→ )

PImage cube;
float angle=0.01;
int mx=300,my=100,rs=300;
void setup(){
    size(500,500);
    cube = loadImage("200.png");
    background(255,255,255);
}
void draw(){
    background(255,255,255);
    translate(mx-18,my-35);
    rotate(angle);
    translate(-mx-35,-my-18);
    image(cube,mx,my);
}
void keyPressed(){
  if(key==CODED && keyCode==LEFT){
    mx-=20;
    if(mx<0)mx=0;
  }
  if(key==CODED && keyCode==RIGHT){
    mx+=20;
    if(mx&rt;445)mx=445;
  }
  if(key==CODED && keyCode==DOWN){
    my+=20;
    if(my&rt;460)my=460;
  }
   if(key==' '){
   angle++;
  }
}





















目前遇到的問題
a. 旋轉無法轉到正確位置
b. 方塊如何與格子做對應

(2) 視訊

視訊程式碼

import processing.video.*;
Capture video;
void setup(){
size(640,480,P2D);
video = new Capture(this, width, height);
video.start();
loadPixels();
}
void draw(){
if(video.available()){
video.read();
video.loadPixels();
for(int i=0;i<640*480;i++){
pixels[i]=video.pixels[i]; 
}
updatePixels();
scale(0.5);
PImage kitty;
kitty = loadImage("132.jpg");
image(kitty, 750,20);

scale(0.8);
PImage kitty2;
kitty2 = loadImage("122.jpg");
image(kitty2, 20,50);
}
}


視訊截圖


黃慶華、詹中豪、王靚暄、蕭靖芸 ya