顯示具有 99160875鍾孟志 標籤的文章。 顯示所有文章
顯示具有 99160875鍾孟志 標籤的文章。 顯示所有文章

2013年1月16日 星期三

Week19,Final

作品名稱:跳不停

1.DEMO影片










2.操作界面


3.程式碼(Arduino)

int sensorPin = A0;
int sensorValue = 0;
int oldValue =0;
int val[6];
int oldval[6];
void setup() {
  Serial.begin(9600);
  for(int i=2;i<7;i++) pinMode(i, INPUT);
}
void loop() {
  sensorValue = analogRead(sensorPin);
  if(sensorValue-oldValue>100){
    Serial.print(8);
    //Serial.write(sensorValue);
    oldValue = sensorValue;
  }
  else if(sensorValue-oldValue<-10){
    Serial.print(9);
    //Serial.write(sensorValue);
    oldValue = sensorValue;
  }
  for(int i=2;i<7;i++) val[i-2] = digitalRead(i);
  if (val[0] != oldval[0]) {
      Serial.print(0);
      //Serial.write(0);
      oldval[0] = val[0];
  }
  if (val[1] != oldval[1]) {
      Serial.print(1);
      //Serial.write(1);
      oldval[1] = val[1];
  }
  if (val[2] != oldval[2]) {
      Serial.print(2);
      //Serial.write(2);
      oldval[2] = val[2];
  }
  if (val[3] != oldval[3]) {
      Serial.print(3);
      //Serial.write(3);
      oldval[3] = val[3];
  }
  if (val[4] != oldval[4]) {
      Serial.print(4);
      //Serial.write(4);
      oldval[4] = val[4];
  }
}

4.程式碼(Processing)

import ddf.minim.*;
Minim minim;
AudioPlayer bgm0;//背景音樂1
AudioPlayer bgm1;//背景音樂2
AudioPlayer bgm2;//背景音樂3
import processing.serial.*;
Serial myPort;
int val;
int mute,nowbgm;//靜音,現正播放
int m,savedtime,stage=0;
int gameover=0;
int character,count;
int score,time;//現在時間,現在分數
float characterX=50,characterY=0;//人物位置
float vx=1,vy;//人物速度
float g=0.1;//場景重力
float stageX,startX;//場景位移,怪物位移
float[] monsterX = new float[20];//怪物位置
int nowbtn=1;
PImage Pstage,Pstop,help,title;
PImage[][] Pcharacter = new PImage[20][6];//人物
PImage[][] Pmonster = new PImage[20][6];//怪物
PImage[][] Pbutton = new PImage[2][2];//選單按鈕
PImage Pscore,Ptime,dotImage,xx;//分數,時間,冒號,乘號
PImage[] num = new PImage[10];
PImage[] sound = new PImage[2];//音樂開關
PImage[] playing = new PImage[3];//播放中
void setup(){
  String portName = Serial.list()[0];
  myPort = new Serial(this, "COM3", 9600);
  size(1280,720);
  Pstage=loadImage("stage.png");
  Pstop=loadImage("stop.png");
  help=loadImage("help.png");
  title=loadImage("title.png");
  for(int i=0;i<20;i++){
    for(int j=0;j<6;j++){
      Pcharacter[i][j] = loadImage("/character/Frame"+i+"_"+j+".png");//人物
      Pmonster[i][j] = loadImage("/monster/Frame"+i+"_"+j+".png");//怪物
      if(i<2&&j<2) Pbutton[i][j] = loadImage("button"+i+"_"+j+".png");//選單按鈕
    }
    monsterX[i]=monsterX[i]=320+random(6400);//怪物位置
    if(i<10) num[i] = loadImage("/count/"+i+".png");//場景
    if(i<2) sound[i] = loadImage("sound"+i+".png");//音樂開關
    if(i<3) playing[i] = loadImage((i+1)+".png");//播放中 
  }
  Pscore = loadImage("/count/score.png");//分數
  Ptime = loadImage("/count/time.png");//時間
  dotImage = loadImage("/count/dot.png");//冒號
  xx = loadImage("/count/x.png");
  minim = new Minim(this);
  bgm0 = minim.loadFile("/bgm/bgm0.mp3");//背景音樂1
  bgm1 = minim.loadFile("/bgm/bgm1.mp3");//背景音樂2
  bgm2 = minim.loadFile("/bgm/bgm2.mp3");//背景音樂3
}
void draw(){
  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();
    control(val);
  }
  m = millis();
  showstage(stage);
  showsound(mute,nowbgm);//音樂控制
}
void showmonster(int x,float y){
  image(Pmonster[x][m/100%5],y,500);
  if(characterX>y&&characterX<y+44&&characterY>433.5&&characterY<566.5){
    gameover=1;
  }
}
void showstage(int x){
  switch(x){
    case 0: 
    image(Pstage,0,0);
    image(title,0,0);
    image(Pbutton[0][0],440,300);//選單按鈕1
    image(Pbutton[1][0],440,450);//選單按鈕2
    if(nowbtn==1) image(Pbutton[0][1],440,300);//選單按鈕1
    else if(nowbtn==2) image(Pbutton[1][1],440,450);//選單按鈕2
    break;
    case 1:
    if(stageX<-1280)  stageX+=1280;
    image(Pstage,0,0);
    image(Pstage,stageX+1280,0);
    image(Pcharacter[character][m/100%5],characterX,characterY);
    for(int i=0;i<20;i++){
    if(monsterX[i]+startX<-100) monsterX[i]+=1280+random(6400);
    showmonster(i,monsterX[i]+startX);
    }
    vy-=g;
    if(abs(vy)<0.1) vy=0;
    characterY-=vy;
    if(characterY>=500){
      vy=0;
      characterY=500;
    }
    if(characterY<=0) characterY=0;
    vx*=0.999;
    characterX+=vx;
    if(characterX>640){
      characterX=640;
      stageX-=vx;
      startX-=vx;
    }
    if(gameover==1){
      vx=0;
      vy=0;
      g=0;
      image(Pstop,0,0);
    }
    if(vx!=0){
    score++;
    int  passedtime = millis() - savedtime;
    time=passedtime;
    }
    showScore(score);
    showTime(time/10); 
    break;
    case 2:
    image(Pstage,0,0);
    image(title,0,0);
    image(help,320,180);
    break;
  }
}
void showScore(int x){
  int a,b,c,d,e,f;
  f=x%10; x/=10;
  e=x%10; x/=10;
  d=x%10; x/=10;
  c=x%10; x/=10;
  b=x%10; x/=10;
  a=x%10;
  image(Pscore,920,10);
  image(num[a],1080,10);
  image(num[b],1110,10);
  image(num[c],1140,10);
  image(num[d],1170,10);
  image(num[e],1200,10);
  image(num[f],1230,10);
}
//顯示時間
void showTime(int x){
  int a,b,c,d,e,f;
  f=x%10; x/=10;
  e=x%10; x/=10;
  d=x%10;  x/=10;
  c=x%6; x/=6;
  b=x%10; x/=10;
  a=x;
  image(Ptime,10,10);
  image(num[a],120,10);
  image(num[b],150,10);
  image(dotImage,180,10);
  image(num[c],210,10);
  image(num[d],240,10);
  image(dotImage,270,10);
  image(num[e],300,10);
  image(num[f],330,10);
}
void keyPressed() {
  switch(stage){
    case 0:
    if (key == CODED) {
      if (keyCode == UP) {
        nowbtn=1;
      } else if (keyCode == DOWN) {
        nowbtn=2;
      }
    }
    if(key == 'z'){
        stage=nowbtn;
    }
    break;
    case 1:
    if(key == 'x'){
      if(gameover==0)
      if(characterY>=500) vy+=10;
    }
    if(key == 'c'){
        if(gameover==0) vx++;
    }
    if(key == 'z'){
      if(gameover==1)
        exit();
    }
    break;
    case 2:
    if(key == 'z'){
        stage=0;
    }
    break;
  }
}
void control(int x){
  if(x == '4'){
      mute++;
  }
  if(x == '8'){
      if(nowbgm<3) nowbgm++;
  }
  else if(x == '9'){
     if(nowbgm>0)nowbgm--;
  }
  switch(stage){
   case 0:
    if (x == '1') {
      nowbtn=1;
    } else if (x == '2') {
      nowbtn=2;
    }
    if(x == '0'){
        stage=nowbtn;
    }
    break;
    case 1:
    if(x == '1'){
      if(gameover==0)
      if(characterY>=500) vy+=10;
    }
    if(x == '2'){
        if(gameover==0) vx++;
    }
    if(x == '0'){
      if(gameover==1)
        exit();
    }
    if(x == '3'){
      if(gameover==0){
        count++;
        character=count%20;
      }
    }
    break;
    case 2:
    if(x == '0'){
        stage=0;
    }
    break;
  }
}
void showsound(int x,int y){
  image(num[1],70,660);
  image(num[2],110,660);
  image(num[3],150,660);
  if(x%4==2){
    image(sound[0],10,660);
    switch(y){
      case 0:
      bgm0.play();
      bgm1.pause();
      bgm2.pause();
      image(playing[0],70,660);
      break;
      case 1:
      bgm1.play();
      bgm0.pause();
      bgm2.pause();
      image(playing[1],110,660);
      break;
      case 2:
      bgm2.play();
      bgm1.pause();
      bgm0.pause();
      image(playing[2],150,660);
      break;
    }
  }else if(x%4==0){
    image(sound[1],10,660);
    bgm0.pause();
    bgm1.pause();
    bgm2.pause();
  }
}


5.心得

這次製作其實沒有想像中的簡單,大概是因為我對電路不夠熟悉的緣故
同時在Processing跟Arduino的連結也很差勁
其實感覺還有很多可改進的部分。

2013年1月15日 星期二

Week15,HW12

期末進度

原本打算做出新的程式,但是沒有好的想法
可能還是使用期中作品的修改
但是其中的操作是使用滑鼠,要對應到Arduino可能還有問題
首先得先把鍵盤部分做出來。

Week13,HW11

簡易鋼琴(可變音)

1.影片
2.心得

喇叭的線容易接觸不良,在接線時有些麻煩。

3.程式碼

int val[6];
int sensorPin = A0;
int sensorValue = 0;
void setup(){
  for(int i=2;i<7;i++) pinMode(i, INPUT);
}
void loop(){
  sensorValue = analogRead(sensorPin); 
  for(int i=2;i<7;i++) val[i-2] = digitalRead(i);
  for(int i=0;i<6;i++)
    if (val[i] == HIGH) {
      switch(i){
        case 0 : tone(8,262+sensorValue,4); break;
        case 1 : tone(8,294+sensorValue,4); break;
        case 2 : tone(8,330+sensorValue,4); break;
        case 3 : tone(8,349+sensorValue,4); break;
        case 4 : tone(8,392+sensorValue,4 ); break;
      }
    }
}


2012年11月30日 星期五

Week12, HW10

1.1 全開全關(來回),使用旋鈕調整速度


int sensorPin = A0;
int ledPin;
int sensorValue = 0;

void setup() {
  for(ledPin=7;ledPin<=13;ledPin++)
    pinMode(ledPin, OUTPUT);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  for(ledPin=7;ledPin<=13;ledPin++){
    digitalWrite(ledPin, HIGH);
    delay(sensorValue);
  }
  for(ledPin=7;ledPin<=13;ledPin++){
    digitalWrite(ledPin, LOW);
    delay(sensorValue);
  }
  for(ledPin=13;ledPin>=7;ledPin--){
    digitalWrite(ledPin, HIGH);
    delay(sensorValue);
  }  
  for(ledPin=13;ledPin>=7;ledPin--){
    digitalWrite(ledPin, LOW);
    delay(sensorValue);
  }
}

1.2 單顆開關(來回),使用旋鈕調整速度


int sensorPin = A0;
int ledPin;
int sensorValue = 0;

void setup() {
  for(ledPin=7;ledPin<=13;ledPin++)
    pinMode(ledPin, OUTPUT);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  for(ledPin=7;ledPin<=13;ledPin++){
    digitalWrite(ledPin, HIGH);
    delay(sensorValue);
    digitalWrite(ledPin, LOW);
    delay(sensorValue);
  }
  for(ledPin=12;ledPin>=8;ledPin--){
    digitalWrite(ledPin, HIGH);
    delay(sensorValue);
    digitalWrite(ledPin, LOW);
    delay(sensorValue);
  }  
}

1.3 多顆開關(來回) ,使用旋鈕調整速度


int sensorPin = A0;
int ledPin;
int sensorValue = 0;

void setup() {
  for(ledPin=7;ledPin<=13;ledPin++)
    pinMode(ledPin, OUTPUT);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  for(ledPin=7;ledPin<=11;ledPin++){
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin+1, HIGH);
    digitalWrite(ledPin+2, HIGH);
    delay(sensorValue);
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin+1, LOW);
    digitalWrite(ledPin+2, LOW);
    delay(sensorValue);
  }
  for(ledPin=12;ledPin>=10;ledPin--){
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin-1, HIGH);
    digitalWrite(ledPin-2, HIGH);
    delay(sensorValue);
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin-1, LOW);
    digitalWrite(ledPin-2, LOW);
    delay(sensorValue);
  }
}

1.4 使用旋鈕開關(單顆)


int sensorPin = A0;
int ledPin;
int sensorValue = 0;
float width=1023/6;

void setup() {
  for(ledPin=7;ledPin<=13;ledPin++)
    pinMode(ledPin, OUTPUT);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  ledPin=sensorValue/width+7;
  digitalWrite(ledPin-1, LOW);
  if(ledPin<13) digitalWrite(ledPin+1, LOW);
  digitalWrite(ledPin, HIGH);
}



2012年11月20日 星期二

Week11,HW09

1.Arduino影片

 

2.可以用Arduino&Processing 做些什麼?

將Processing的遊戲用Arduino接上硬體作成機台

2012年11月12日 星期一

Midterm

期中作品檔案下載 SKYDRIVE

期中DEMO影片


截圖:

開頭動畫(含音樂) 
人物每次都會不同,點擊滑鼠可以SKIP動畫

遊戲選單
上面是新遊戲、下面是說明頁面 
左下可以切換/關閉音樂、右下可以離開遊戲
按鈕有點擊音效,及圖片變換



說明頁面
可以點擊箭頭換頁

人物選擇
使用滑鼠點擊選擇人物,人物在滑鼠移到上面時會動作
按下R鍵某人物會出現隱藏版
左方可以隨機選角(含第二位隱藏人物)

場景選擇
使用滑鼠點擊選擇場景,場景為半透明
在滑鼠移到上面時會恢復正常

遊戲畫面
使用發射人物飛行,距離越遠時間越長越好
下方怪物可以改變方向及速度
有兩種特殊怪物
對某類怪物撞擊一定數量可以發動COMBO(共3種

遊戲結束
人物完全停止時結束,此時右下按鍵不再是強行結束
而會進到紀錄頁

紀錄頁
顯示本次成績及最佳成績

程式碼:

//音樂宣告
import ddf.minim.*;
Minim minim;
AudioPlayer effect0;//開場音樂
AudioPlayer effect1;//點擊音效
AudioPlayer bgm0;//背景音樂1
AudioPlayer bgm1;//背景音樂2
AudioPlayer bgm2;//背景音樂3
//圖片宣告
PImage[][] character = new PImage[20][6];//人物
PImage[][] monster = new PImage[20][6];//怪物
PImage[] title = new PImage[3];//遊戲畫面
PImage[] stage = new PImage[4];//遊戲場景
PImage[] num = new PImage[10];//遊戲場景
PImage[][] button = new PImage[2][3];//選單按鈕
PImage[][] item = new PImage[2][2];//道具按鈕
PImage[] sound = new PImage[2];//音樂開關
PImage[] arrow = new PImage[2];//上下箭頭
PImage[] help = new PImage[3];//說明
PImage[] playing = new PImage[3];//播放中
PImage score,time,dotImage,xx;//分數,時間,冒號,乘號
PImage gameover;//遊戲結束
PImage Uimg,Dimg,Simg,Cimg;//上,下,特殊,連擊
PImage left,right,home;//左右按鈕,回主畫面
PImage endgame,randomcharacter;//離開遊戲,隨機人物
//字型宣告
PFont Font0,Font1;
//變數宣告
int nowtitle=0,nowstage=0;//顯示畫面,顯示場景
int nowcharacter,nowmonster;//顯示人物,顯示怪物
float characterX=0,characterY=500;//人物位置
float vx,vy;//人物速度
float g=0.1;//場景重力
float stageX,startX;//場景位移,怪物位移
float[] monsterX = new float[20];//怪物位置
int m,saver,savedtime;//計時器
int select;//隨機
int ucount=3,dcount=3;//道具殘量
int shot=0,timeover;//板機,強制結束
int combo[] = new int[3];
int page,mute,nowbgm;//頁數,靜音,現正播放
int nowscore,nowtime;//現在時間,現在分數
int oldtime,oldscore;
//檔案
PrintWriter output,output2;
BufferedReader reader,reader2;
String line,line2;
//初始設定
void setup(){
  size(1280,720);//視窗大小
  //
  reader = createReader("/data/score.txt");
  reader2 = createReader("/data/time.txt");
  //載入圖片
  for(int i=0;i<20;i++){
    for(int j=0;j<6;j++){
      character[i][j] = loadImage("/graphic/character/Frame"+i+"_"+j+".png");//人物
      monster[i][j] = loadImage("/graphic/monster/Frame"+i+"_"+j+".png");//怪物
      if(i<2&&j<3) button[i][j] = loadImage("/graphic/button/button"+i+"_"+j+".png");//選單按鈕
      if(i<2&&j<2) item[i][j] = loadImage("/graphic/button/item"+i+"_"+j+".png");//道具按鈕
    }
    monsterX[i]=monsterX[i]=320+random(5120);//怪物位置
    if(i<3){
      title[i] = loadImage("/graphic/title/title"+i+".png");//畫面
      help[i] = loadImage("/graphic/help/help"+i+".png");//畫面
      playing[i] = loadImage("/graphic/button/"+(i+1)+".png");//播放中 
    }
    if(i<2){
      sound[i] = loadImage("/graphic/button/sound"+i+".png");//音樂開關
      arrow[i] = loadImage("/graphic/icon/arrow"+i+".png");//上下箭頭
      
    }
    if(i<4) stage[i] = loadImage("/graphic/stage/stage"+i+".png");//場景
    if(i<10) num[i] = loadImage("/graphic/count/"+i+".png");//場景
  }
  Uimg = loadImage("/graphic/icon/up.png");//上
  Dimg = loadImage("/graphic/icon/down.png");//下
  Simg = loadImage("/graphic/icon/special.png");//特殊
  Cimg = loadImage("/graphic/icon/combo.png");//連擊
  score = loadImage("/graphic/count/score.png");//分數
  time = loadImage("/graphic/count/time.png");//時間
  dotImage = loadImage("/graphic/count/dot.png");//冒號
  xx = loadImage("/graphic/count/x.png");
  home = loadImage("/graphic/button/home.png");//回主畫面
  randomcharacter = loadImage("/graphic/button/random.png");//隨機人物
  left = loadImage("/graphic/button/left.png");//左箭頭
  right = loadImage("/graphic/button/right.png");//右箭頭
  gameover = loadImage("/graphic/icon/stop.png");//遊戲結束
  endgame = loadImage("/graphic/button/exit.png");//離開遊戲
  //設定字型
  Font0 = createFont("FFScala", 36);//字型1
  Font1 = createFont("FFScala", 18);//字型2
  //設定隨機
  select = (int) random(19.99);//隨機人物
  //載入音樂
  minim = new Minim(this);
  effect0 = minim.loadFile("/sound/effect/0.mp3");//開場音樂
  effect1 = minim.loadFile("/sound/effect/1.mp3");//點擊音效
  bgm0 = minim.loadFile("/sound/bgm/bgm0.mp3");//背景音樂1
  bgm1 = minim.loadFile("/sound/bgm/bgm1.mp3");//背景音樂2
  bgm2 = minim.loadFile("/sound/bgm/bgm2.mp3");//背景音樂3
}
//顯示畫面
void showtitle(int x){
  switch(x){
    case 0://開場動畫
    image(title[0],0,0);//顯示title0.jpg
    image(monster[select][m/100%5],596,200);//隨機人物動畫
    fill(m/10%255,m/10%255,0);//顏色
    textFont(Font0);//字型
    text("99160875 Midterm Work",450,400);//閃動文字
    effect0.play();//開場音樂
    //結束開場
    if(m&rt;10000){ 
      nowtitle=1;
      effect0.close();
    }
    break;    
    case 1://主選單
    image(title[1],0,0);//顯示title1.jpg
    image(button[0][0],440,300);//選單按鈕1
    image(button[1][0],440,450);//選單按鈕2
    image(endgame,1220,660);//離開遊戲
    if(mouseX&rt;440 && mouseX<900){
      if(mouseY&rt;300 && mouseY<410) image(button[0][1],440,300);//選單按鈕1
      if(mouseY&rt;450 && mouseY<560) image(button[1][1],440,450);//選單按鈕2
    }
    nowscore=0; nowtime=0;
    break;
    case 2://人物選擇
    image(title[1],0,0);//顯示title1.jpg
    fill(m/10%255,0,0);//顏色
    textFont(Font0);//字型1
    text("Select Character",500,220);//閃動文字
    //顯示人物
    for(int i=0;i<9;i++){
      showcharacter(i,10+i*100,300);
      showcharacter(i+9,60+i*100,450);
    }
    image(randomcharacter,1010,310);//隨機人物
    break;
    case 3://場景選擇
    image(title[1],0,0);//顯示title1.jpg
    fill(m/10%255,0,0);//顏色
    textFont(Font0);//字型1
    text("Select Stage",530,220);//閃動文字
    for(int i=0;i<3;i++) showstage(i,80+i*400,290);//顯示場景
    break;
    case 4://遊戲說明
    image(title[1],0,0);//顯示title1.jpg
    image(help[page],320,180);//顯示說明
    if(page&rt;0)image(left,130,285);//上頁
    if(page<2)image(right,1000,285);//下頁
    fill(255,0,0);//顏色
    textFont(Font0);//字型1
    text((page)+"/2",600,600);//頁數
    break;
    case 5://主畫面
    showstage();//遊戲場景
    break;
    case 6://遊戲紀錄
    image(title[2],0,0);//顯示title2.jpg
    fill(0,0,255);
    textFont(Font0);
    int a=nowtime/1000;
    int b=nowtime/1000;
    text("TIME:"+a+" sec    SCORE:"+nowscore,420,360);
    fill(255,0,0);
    textFont(Font0);
    
    text("BEST TIME:"+(b&rt;a?b:a)+" sec",520,460);
    text("BEST SCORE:"+(oldscore&rt;nowscore?oldscore:nowscore),470,410);
}
  if(nowtitle&rt;0) showsound(mute,nowbgm);//音樂控制
  if(nowtitle&rt;1) image(home,1220,660);//回主畫面
}
//顯示場景選擇
void showstage(int x,float y,float z){
  image(stage[x],y,z,320,180);
  image(stage[3],y,z,320,180);
  if(mouseX&rt;y&&mouseX<y+320&&mouseY&rt;z&&mouseY<z+180){
    image(arrow[0],y+135,z-60);
    image(stage[x],y,z,320,180);
  }
}
//遊戲場景
void showstage(){
  if(saver==0){
    savedtime = millis();
    saver++;
  }
  if(stageX<-1280)  stageX+=1280;
  image(stage[nowstage],0,0);
  image(stage[nowstage],stageX+1280,0);
  strokeWeight(4);
  image(character[nowcharacter][m/100%5],characterX,characterY);
  for(int i=0;i<20;i++){
    if(monsterX[i]+startX<-100) monsterX[i]+=1280+random(5120);
    showmonster(i,monsterX[i]+startX);
  }
  fill(255,0,0);
  textFont(Font0);
  text("VX:"+vx,1000,100); 
  text("VY:"+vy,1000,150);
  vy-=g;
  characterY-=vy;
  if(characterY&rt;=500){
    vy=-vy*0.5;
    vx*=0.9;
    characterY=500;
  }
  if(characterY<-133){
    image(arrow[1],characterX,0);
    textFont(Font1);
    text("Y:"+abs(characterY),characterX-30,70); 
  }
  if(abs(vy)<0.1) vy=0;
  vx*=0.99;
  if(vx<0.4) vx=0;
  characterX+=vx;
  if(characterX&rt;640){
    characterX=640;
    stageX-=vx;
    startX-=vx;
  }
  if(vx&rt;0||abs(vy)&rt;0){
    nowscore+=vx/10;
    int  passedtime = millis() - savedtime;
    nowtime=passedtime;
    if(nowscore%1000==0){
      if(ucount<3) ucount++;
      if(ucount<3) dcount++;
    }
  }
  else if(characterX!=0&&characterY==500){
    image(gameover,0,0);
    timeover=1;
    if(oldscore<nowscore){
      output = createWriter("/data/score.txt"); 
      output.println(nowscore);
      output.flush(); // Writes the remaining data to the file
      output.close(); // Finishes the file
    }
    if(oldtime<nowtime){
      output2 = createWriter("/data/time.txt"); 
      output2.println(nowtime);
      output2.flush(); // Writes the remaining data to the file
      output2.close(); // Finishes the file
    }
  }
  up(); down();
  showScore(nowscore);
  showTime(nowtime/10); 
}
//道具1
void up(){
  if(ucount&rt;0&&vy<0) image(item[1][0],10,100);
  else image(item[1][1],10,100);
  image(xx,60,100);
  image(num[ucount],110,100);
}
//道具2
void down(){
  if(dcount&rt;0&&vy&rt;0) image(item[0][0],10,160);
  else image(item[0][1],10,160);
  image(xx,60,160);
  image(num[dcount],110,160);
}
//顯示人物
void showcharacter(int x,float y,float z){
  if(mouseX&rt;y&&mouseX<y+88&&mouseY&rt;z&&mouseY<z+133){
    image(arrow[0],y+19,z-50);
    if(x==11&&keyPressed){
      if(key=='r'||key=='R') image(character[18][m/100%5],y,z);
    }else image(character[x][m/100%5],y,z);
  }else image(character[x][0],y,z);
}
//顯示怪物
void showmonster(int x,float y){
  image(monster[x][m/100%5],y,500);
  if(characterX&rt;y&&characterX<y+44&&characterY&rt;433.5&&characterY<566.5){
    switch(x){
      case 0:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx+=5;
        vy+=5;
      }
      break;
      case 1:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else{
        vx+=10;
        vy+=5;
      }
      break;
      case 2:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx+=5;
        vy+=10;
      }
      break;
      case 3:
      combo[2]++;
      if(combo[2]==3){
        combo[2]=0;
        vx+=100;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx+=10;
        vy+=10;
      }
      break;
      case 4:
      combo[2]++;
      if(combo[2]==3){
        combo[2]=0;
        vx+=100;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx-=5;
        vy-=5;
      }
      break;
      case 5:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx-=10;
        vy-=5;
      }
      break;
      case 6:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx-=5;
        vy-=10;
      }
      break;
      case 7:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else{
        vx-=10;
        vy-=10;
      }
      break;
      case 8:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx-=5;
        vy+=10;
      }
      break;
      case 9:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else{
        vx+=10;
        vy-=5;
      }
      break;
      case 10:
      combo[2]++;
      if(combo[2]==3){
        combo[2]=0;
        vx+=100;
        vy+=100;
        image(Cimg,50,240);
      }else vx+=20;
      break;
      case 11:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else vy+=20;
      break;
      case 12:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else vx-=20;
      break;
      case 13:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else vy-=20;
      break;
      case 14:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else{
        vx+=5;
        vy+=5;
      }
      break;
      case 15:
      combo[0]++;
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx+=5;
        vy+=5;
      }
      break;
      case 16:
      combo[1]++;
      if(combo[1]==3){
        combo[1]=0;
        vx+=100;
        vy+=50;
        image(Cimg,50,240);
      }else{
        vx-=5;
        vy-=5;
      }
      break;
      case 17:
      if(combo[0]==3){
        combo[0]=0;
        vx+=50;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx-=5;
        vy-=5;
      }
      break;
      case 18:
      if(combo[2]==3){
        combo[2]=0;
        vx+=100;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx+=50;
        vy+=50;
        image(Simg,50,240);
      }
      break;
      case 19:
      combo[2]++;
      if(combo[2]==3){
        combo[2]=0;
        vx+=100;
        vy+=100;
        image(Cimg,50,240);
      }else{
        vx=0;
        vy=0;
        image(gameover,0,0);
        timeover=1;
      };
      break;
    }
  }
}
//設定滑鼠拖曳事件
void mouseDragged(){
  //準備發射
  if(nowtitle==5&&shot==0){
    line(44,566,mouseX,mouseY);
    image(character[nowcharacter][m/100%5],mouseX-44,mouseY-66.5);
  }
}
//設定滑鼠釋放事件
void mouseReleased(){
  //發射加速
  if(nowtitle==5&&shot==0){
    vx+=abs(characterX-mouseX-44)/10;
    vy-=abs(characterY-mouseY+66.5)/10;
    shot++;
  }
}
//設定滑鼠點擊事件
void mouseClicked(){
  switch(nowtitle){
    case 0://開場動畫
    effect0.close();
    nowtitle=1;
    break;
    case 1://主選單
    if(mouseX&rt;440 && mouseX<900){
      //選單按鈕1
      if(mouseY&rt;300 && mouseY<410){
        effect1.play();
        image(button[0][2],440,300);
        nowtitle=2;
      }
      //選單按鈕2
      if(mouseY&rt;450 && mouseY<560){
        effect1.play();
        image(button[1][2],440,450);
        nowtitle=4;
      }
    }
    if(mouseX&rt;1220 && mouseX<1270 && mouseY&rt;660 && mouseY<710){
      effect1.play();
      exit();
    }    
    break;
    case 2://人物選擇
    //第一排
    if(mouseY&rt;300 && mouseY<433){
      if(mouseX&rt;10 && mouseX<98){
        nowcharacter=0;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;110 && mouseX<198){
        nowcharacter=1;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;210 && mouseX<298){
        nowcharacter=2;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;310 && mouseX<398){
        nowcharacter=3;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;410 && mouseX<498){
        nowcharacter=4;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;510 && mouseX<598){
        nowcharacter=5;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;610 && mouseX<698){
        nowcharacter=6;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;710 && mouseX<798){
        nowcharacter=7;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;810 && mouseX<898){
        nowcharacter=8;
        nowtitle=3;
        effect1.play();
      }
    }
    //第二排
    if(mouseY&rt;450&&mouseY<583){
      if(mouseX&rt;60 && mouseX<148){
        nowcharacter=9;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;160 && mouseX<248){
        nowcharacter=10;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;260 && mouseX<348){
        if(keyPressed){
          if(key=='r'||key=='R') nowcharacter=18;
        }else nowcharacter=11;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;360 && mouseX<448){
        nowcharacter=12;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;460 && mouseX<548){
        nowcharacter=13;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;560 && mouseX<648){
        nowcharacter=14;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;660 && mouseX<748){
        nowcharacter=15;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;760 && mouseX<848){
        nowcharacter=16;
        nowtitle=3;
        effect1.play();
      }
      if(mouseX&rt;860 && mouseX<948){
        nowcharacter=17;
        nowtitle=3;
        effect1.play();
      }
    }
    if(mouseX&rt;1010 && mouseX<1210 && mouseY&rt;310 && mouseY<510){
      effect1.play();
      nowcharacter=select;
      nowtitle=3;
    }
    break;
    case 3://場景選擇
    if(mouseY&rt;360 && mouseY<540){
      if(mouseX&rt;80 && mouseX<400){
        effect1.play();
        nowtitle=5;
        nowstage=0;
      }
      if(mouseX&rt;480 && mouseX<800){
        effect1.play();
        nowtitle=5;
        nowstage=1;
      }
      if(mouseX&rt;880 && mouseX<1200){
        effect1.play();
        nowtitle=5;
        nowstage=2;
      }
    }
    break;
    case 4://遊戲說明
    if(mouseY&rt;285 && mouseY<435){
      if(mouseX&rt;130 && mouseX<280 && page&rt;0){
        page--;
        effect1.play();
      }
      if(mouseX&rt;1000 && mouseX<1150 && page<2){
        page++;
        effect1.play();
      }
    }   
    break;
    case 5:
    if(mouseX&rt;10 && mouseX<60 && timeover==0){
      if(mouseY&rt;100 && mouseY<150){
        if(ucount&rt;0&&vy<0){
            vx+=20;
            vy+=20;
            ucount--;
            image(Uimg,50,240);
            effect1.play();
        }
      }
      if(mouseY&rt;160 && mouseY<210){
        if(dcount&rt;0&&vy&rt;0){
            vx+=20;
            vy-=20;
            dcount--;
            image(Dimg,50,240);
            effect1.play();
        }
      }
    }
    break;
  }
  if(nowtitle&rt;0){
    if(mouseY&rt;660&&mouseY<710){
      if(mouseX&rt;10&&mouseX<60){
        mute++;
        effect1.play();
      }
      if(mouseX&rt;70&&mouseX<110){
        nowbgm=0;
        bgm1.pause();
        bgm2.pause();
        effect1.play();
      }
      if(mouseX&rt;110&&mouseX<150){
        nowbgm=1;
        bgm0.pause();
        bgm2.pause();
        effect1.play();
      }
      if(mouseX&rt;150&&mouseX<190){
        nowbgm=2;
        bgm0.pause();
        bgm1.pause();
        effect1.play();
      }
    }
  }
  //回主畫面&歸零
  if(nowtitle&rt;1){
    if(mouseX&rt;1220 && mouseX<1270 && mouseY&rt;660 && mouseY<710){
      if(nowtitle!=5) nowtitle=1;
      else{
        nowtitle=6;
      }
      mute=1;  
      page=0; shot=0;
      ucount=3; dcount=3;  
      characterX=0; characterY=500;
      for(int i=0;i<20;i++) monsterX[i]=monsterX[i]=320+random(5120);//怪物位置
      stageX=0;startX=0;
      vx=0; vy=0;
      saver=0;
      effect1.play();
    }
  }
}
//音樂控制
void showsound(int x,int y){
  image(num[1],70,660);
  image(num[2],110,660);
  image(num[3],150,660);
  if(x%2==0){
    image(sound[0],10,660);
    switch(y){
      case 0:
      bgm0.play();
      image(playing[0],70,660);
      break;
      case 1:
      bgm1.play();
      image(playing[1],110,660);
      break;
      case 2:
      bgm2.play();
      image(playing[2],150,660);
      break;
    }
  }else{
    image(sound[1],10,660);
    bgm0.pause();
    bgm1.pause();
    bgm2.pause();
  }
}
//顯示分數
void showScore(int x){
  int a,b,c,d,e,f;
  f=x%10; x/=10;
  e=x%10; x/=10;
  d=x%10; x/=10;
  c=x%10; x/=10;
  b=x%10; x/=10;
  a=x%10;
  image(score,920,10);
  image(num[a],1080,10);
  image(num[b],1110,10);
  image(num[c],1140,10);
  image(num[d],1170,10);
  image(num[e],1200,10);
  image(num[f],1230,10);
}
//顯示時間
void showTime(int x){
  int a,b,c,d,e,f;
  f=x%10; x/=10;
  e=x%10; x/=10;
  d=x%10;  x/=10;
  c=x%6; x/=6;
  b=x%10; x/=10;
  a=x;
  image(time,10,10);
  image(num[a],120,10);
  image(num[b],150,10);
  image(dotImage,180,10);
  image(num[c],210,10);
  image(num[d],240,10);
  image(dotImage,270,10);
  image(num[e],300,10);
  image(num[f],330,10);
}
void draw(){
  try {
    line = reader.readLine();
  } catch (IOException e) {
    e.printStackTrace();
    line = null;
  }
  if (line == null) {
    // Stop reading because of an error or file is empty
    //noLoop();  
  } else {
    oldscore=int(line);
  }
    try {
    line2 = reader2.readLine();
  } catch (IOException e) {
    e.printStackTrace();
    line2 = null;
  }
  if (line2 == null) {
    // Stop reading because of an error or file is empty
    //noLoop();  
  } else {
    oldtime=int(line2);
  }
  m = millis();
  showtitle(nowtitle);
}

P.S. 其實在這次成品前,經過多次大行修改,和第8周時完全是兩回事了XD