2013年12月30日 星期一

Week16 葉玉婷

今日進度:
寫完程式碼並可以成功結合Arduino

Processing的程式碼:

import processing.serial.*;
Serial serial;
int sensorValue;

//音樂
import ddf.minim.*;
Minim m;
AudioPlayer player;

float x = 300;
float y = 300;
float dx = 3;
float dy = -5;
int t;
int bloom=3;
int n=0;
int count=0;
int points=0; //得分
PImage pig; //豬頭的圖
PImage ban; //金箍棒的圖
PImage back; //背景圖
PImage heart; //生命值

float heightbounce=450;

//層級
boolean[][] inside=new boolean[1][11];

void setup()
{
  serial=new Serial(this, "COM4", 9600); //連結arduino
  size(600, 600); //視窗尺寸
  frameRate(60);
  smooth();

  m = new Minim(this);

  player=m.loadFile("music.mp3");
  player.play(); 

  pig=loadImage("pig.png"); //讀入豬頭圖
  ban=loadImage("ban.png"); //讀入金箍棒圖
  back=loadImage("back.jpg"); //讀入背景圖
  heart=loadImage("heart.png"); //讀入愛心
}

void draw()
{

  if (t==0) //新級別
  {

    background(back); //背景

    stroke(0);

    if (count<120) //前兩秒顯示第幾關
    {
      fill(0); //填入黑色
      textAlign(CENTER);
      text("LEVEL " + inside.length, 300, 400); //顯示第幾關
    }

    strokeWeight(10); //球的大小
    point(x, y); //顯示球球
    strokeWeight(1); //打擊框框大小

    randomSeed(1); //隨機

    //打豬頭
    for (int j=0;j<inside.length;j++)
    {
      for (int k=0;k<inside[0].length;k++)
      {
        //豬頭及球的距離
        float dx2=50+50*k-x;
        float dy2=50+50*j-y;
        float dis2=sqrt(pow(dx2, 2)+pow(dy2, 2));

        if (dis2>=25. && inside[j][k]==false) //畫豬
        {
          image(pig, 25+50*k, 50+50*j, 50, 50); //被打的豬豬豬豬
        }

        //關於反彈
        else if (dx2<=(dis2*cos(PI/4))&& dy2<=-(dis2*sin(PI/4)) && inside[j][k]==false)
        {
          dy*=-1;
          inside[j][k]=true;
          points++;
        }
        else if (dx2<=(dis2*cos(PI/4)) && dy2>=(dis2*sin(PI/4)) && inside[j][k]==false)
        {
          dy*=-1;
          inside[j][k]=true;
          points++;
        }
        else if (dy2<=(dis2*sin(PI/4)) && dx2<=-(dis2*cos(PI/4)) && inside[j][k]==false)
        {
          dx*=-1;
          inside[j][k]=true;
          points++;
        }
        else if (dy2<=(dis2*sin(PI/4)) && dx2>=(dis2*cos(PI/4)) && inside[j][k]==false)
        {
          dx*=-1;
          inside[j][k]=true;
          points++;
        }
      }
    }

    float barsize=50;
    strokeWeight(3);

    if (serial.available()>0)
    {
      sensorValue = serial.read();
      println(sensorValue);
    }
    image(ban, (sensorValue*4)-barsize, heightbounce-50, 150, 100);

    //image(ban, mouseX-barsize, heightbounce-50, 150, 100);
    strokeWeight(1);

    // 打到邊界的話
    if (x>=width || x<=0)
    {
      dx*=-1;
    }
    if (y<=0)
    {
      dy*=-1;
    }

    // 設定方位
    if (y>=heightbounce && y<heightbounce+10)
    {
      if (x>((sensorValue*4)-barsize) && x< ((sensorValue*4)-(1./3)*barsize) && dx>0 && dy>0)
      {
        dy*=-0.95;
        dx*=-1.05;
      }
      else if (x>((sensorValue*4)-barsize) && x< ((sensorValue*4)-(1./3)*barsize) && dx<0 && dy>0)
      {
        dy*=-0.95;
        dx*=1.05;
      }
      else if (x>((sensorValue*4)+(1./3)*barsize) && x< ((sensorValue*4)+barsize) && dx>0 && dy>0)
      {
        dy*=-0.95;
        dx*=1.05;
      }
      else if (x>((sensorValue*4)+(1./3)*barsize) && x< ((sensorValue*4)+barsize) && dx<0 && dy>0)
      {
        dy*=-0.95;
        dx*=-1.05;
      }
      else if (x>((sensorValue*4)-(1./3)*barsize) && x< ((sensorValue*4)+(1./3)*barsize) && dy>0) {
        dy*=-1.05;
        dx*=0.95;
      }
    }

    //顯示分數
    textAlign(RIGHT);
    fill(0);
    text(points, 300, 350);

    //遊戲結束
    if (y>height)
    {
      if (bloom>1) //生命值
      {
        t=1;
        fill(0);
        textAlign(CENTER);
        text("CLICK TO RESTART GAME", 300, 400);
        text("PRESS SPACE TO RESTART LEVEL", 300, 500);
        bloom--;
      }
      else
      {
        text("GAME OVER", 300, 300);
      }
    }

    //完成關卡
    if (checkinside()) {
      t=2;
      fill(0);
      textAlign(CENTER);
      text("FINISHED", 300, 300);
      text("CLICK FOR NEXT LEVEL", 300, 400);
    }

    x=x+dx;
    y=y+dy;

    count++;
  }

  //遊戲結束
  else if (t==1)
  {
    x = 300;
    y = 300;
    dx = 3;
    dy = -5;
    count=0;
    points=0;
    if (mousePressed==true)
    {
      t=0;
      inside=new boolean[inside.length][inside[0].length];
    }
    if (keyPressed)
    {
      if (key == ' ')
      {
        t=0;
        inside=new boolean[1][11];
      }
    }
  }

  //關卡完成
  else
  {
    x = 300;
    y = 300;
    dx = 3;
    dy = -5;
    count=0;
    if (mousePressed==true)
    {
      t=0;
      inside=new boolean[inside.length+1][inside[0].length];
    }
  }

  //生命值
  if (bloom==3)
  {
    image(heart, 10, 500, 50, 50);
    image(heart, 70, 500, 50, 50);
  }
  else if (bloom==2)
  {
    image(heart, 10, 500, 50, 50);
  }
  else if (bloom==1)
  {
  }
}

boolean checkinside()
{
  for (int j=0;j<inside.length;j++)
  {
    for (int k=0;k<inside[0].length;k++)
    {
      if (inside[j][k] == false)
      {
        return false;
      }
    }
  }
  return true;
}



Arduino的程式碼:


int potPin = 0; // 可變電阻接在 pin 0 上

void setup() 
{

  Serial.begin(9600);

}

void loop() 

{

  int sensorValue = analogRead(potPin);

  Serial.write(sensorValue/4);

  delay(100);

}

沒有留言:

張貼留言