2012年12月25日 星期二

Week15, HW12,

本周進度為成功時做了兩個按鈕,分別控制讓小人不掉落和重新開始遊戲的部分

本周電路板圖片



以下為本周程式碼

processing

import processing.serial.*;
Serial myPort;
int now;
int now2;
int testState=0;
//int testState2=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;  // current direction of the player (gravity vs pushing)
long score = 0; //分數
long maxscore = 0; //最高分紀錄
int push = 0; //按空白鍵增加
int mode = 1; // 遊戲狀態, 1=running, 0=lost, -1=lost and score printed
float cur_space = 450;  // space to play
float factor = 0.5;     // how far the cave can move max in the y axis for one x step
// 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() {

  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 ();//我寫的背景變色程式
  // draw cave
  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在這
  if (mode == -1) {
    text("Game Over!再玩一次.", 2, 26);
  }
}
void draw()
{

  while (myPort.available ()>0) {
    testState = myPort.read();
    println(testState);
    if (testState==49)
    {
      now = 1;
    }
    if (now==1)
      dir *= 0.997;
    if (testState=='a')
    {
      mode = 1;
      initcave();

    }

  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 == '2') {
    dir *= 0.997;
  }

  if (mode == -1 && (key == '0' )) { //按0重新開始
    mode = 1;
    initcave();
  }
}

ardino

/*
  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 pushButton = 2;
int pushButton2 = 3;
// 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(pushButton, INPUT);
  pinMode(pushButton2, INPUT);
}
int a=0;
int a2=0;
// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);
  int buttonState2 = digitalRead(pushButton2);
  // print out the state of the button:
  if (buttonState == HIGH && a==0 ) {  // If switch is ON,
      Serial.print(1);
      a=1;      // send 1 to Processing
  }
  if (buttonState == LOW && a==1) {                               // If the switch is not ON,
    Serial.println(0); 
      a=0;    // send 0 to Processing
  }
  if (buttonState2 == HIGH && a2==0 ) {  // If switch is ON,
    Serial.print('a');
    a2=1;      // send 1 to Processing
  }
  if (buttonState2 == LOW && a2==1) {                               // If the switch is not ON,
    Serial.println('b'); 
     a2=0;    // send 0 to Processing
  }
 // Serial.println(buttonState);
  delay(10);        // delay in between reads for stability
}


以下為我們的電路板




沒有留言:

張貼留言