2012年11月11日 星期日

Midtern

期中作業程式碼
import processing.serial.*;       // *
int b1, b2;                       // *
Serial port;                      // *
import ddf.minim.*;
PImage space;
int life = 3;
int score = 0;
int blink = 0;
boolean shoot = false;
int pos = 125;
int[] sphereXCoords = { randx(), randx(), randx() };
int[] sphereYCoords = { 0, 0, 0 };
int randx() {
  return int( random(50, 200) );
}
int sphereDiameter = 15;       // 球大小
PFont font;
AudioPlayer player;
Minim minim;
void setup() {
  space = loadImage("space.jpg");
  size(350, 350);              // 視窗大小
    font = createFont("FFScala", 10);
  textFont(font);
//  String portName = Serial.list()[0];             
//  port = new Serial(this,portName, 9600);      
//port = new Serial(this, "COM5", 9600); 
}
 
void draw() {
/*  if(port.available()>0)
  {       
       b1 = port.read();        // *
  b2 = port.read();        // *
  }
  else
  {
    pos+=1;
  }
  frameRate(50);
  if( b1 == 1 )
    pos += 15;
  else if( b1==0 )
    pos+=15;*/
 
  // 背景

             // 背景顏色
            
  image(space,0,0);
  score++;
  if( score%5==0 ) {
    blink = 0;
  }
  else {
    blink = 0;
  }

  // 設定字形
  fill(255,0,0);
  text("L I F E :  "+life, 10, 20);
  text("S E C O N D :  "+score, 10, 35);
 
  // 畫飛機
  fill( color(192,192,192) );   // 著色
  noStroke();                 // 外框
  ellipse(
    pos, 250-15,              // 圓心
    5,10                     // 長短軸
  );
  fill( color(192,192,192) );
  noStroke();               
  triangle(
    pos-5, 250-15,           // x1, y1
    pos+5, 250-15,           // x2, y2
    pos, 230-15               // x3, y3
  );
  triangle(
    pos-15, 250-15,           // x1, y1
    pos+15, 250-15,           // x2, y2
    pos, 240-15               // x3, y3
  );
  smooth();
 
  // 射子彈
  if(shoot == true) {
     sphereKiller(pos);
     shoot = false;
  }
 
  // 隕石掉落
  sphereDropper();
 
  // 判斷遊戲是否結束
  gameEnder(); 
}
// 隕石掉落
void sphereDropper() { 
  stroke(200,0,0);
  fill(100,0,0);
  for (int i=0; i<3; i++) {
    ellipse(
      sphereXCoords[i], sphereYCoords[i]++,
      sphereDiameter, sphereDiameter
    );
  }
}
 
// 射子彈
void sphereKiller(int shotX) {
  boolean hit = false;
  for (int i=0; i<3; i++) {
    if(
      (shotX >= (sphereXCoords[i]-sphereDiameter/2) ) &&
      (shotX <= (sphereXCoords[i]+sphereDiameter/2) )
    ) {
      hit = true;
      background(0,0,255);
      strokeWeight(5);
      stroke(0,0,100);
      line(
        pos, 230,
        pos, sphereYCoords[i]
      );
      ellipse(
        sphereXCoords[i], sphereYCoords[i],
        sphereDiameter+25, sphereDiameter+25
      );
      sphereXCoords[i] = randx();
      sphereYCoords[i] = 0;
      strokeWeight(0.05);
    }   
  }
  if(hit == false) {
    stroke(0,0,255);
    strokeWeight(5);
    line(pos, 0, pos, 230);
    strokeWeight(0.05);
  } 
}
// 鍵盤事件
void keyPressed() {
  if (key == CODED && pos<=220 && pos>=30) {
    if (keyCode == RIGHT)
      pos += 15;
    else if (keyCode == LEFT)
      pos -= 15;
    else if( keyCode == UP )
      shoot = true;
  }
  if( pos>220 )
    pos = 30;
  else if( pos<30 )
    pos = 220;
}
// 判斷遊戲是否結束
void gameEnder() {
  for (int i=0; i<3; i++) {
    if(sphereYCoords[i] == 250) {
      life--;
      if( life==0 ) {
        background( color(0,0,0) );
        fill(255,0,0);
        font = createFont("FFScala", 20);
        textFont(font);
        rotate(0);
        translate(80, 50);
        rotate((PI*20)/180);
        translate(-80, -50);
        text("G A M E  O V E R", 80, 50);
        font = createFont("FFScala", 12);
        textFont(font);
        text(" Y O U  G O T  "+score+"  P O I N T S", 80, 70);
        noLoop();
      }
    }
  }
}
這是一個簡單的射擊遊戲,
一開始進入遊戲會出現一台灰色飛機以及數顆紅色隕石(隕石會往下移動)

上圖左上角有計算剩餘命的數量(圖上目前三條命),還有分數累計。
左右鍵可以控制飛機,上鍵則是發射
如上圖,這是射擊到隕石的瞬間會閃一下這個畫面(看起來比較有射到東西的震撼的感覺)。
當隕石掉到最底而沒有射擊則會扣命
當命都結束時會出現GAMEOVER字樣,還有印出玩家所得到的分數。
展示影片連結:

沒有留言:

張貼留言