2019年12月26日 星期四

Week16_

import processing.serial.*;
import processing.net.*;
Serial serial;
Server server; Client client;
PVector ball, bV, RUC, LUC, RV, LV;
int bc=10, t1=0, t2=0;//bc=球變色,t1:t2=分數
void setup() {
  size(800, 600);
  server=new Server(this, 7777);
  frameRate(60);
  ball= new PVector(400, 300);
  bV= new PVector(2, 2);
  RUC= new PVector(750, 300);
  LUC= new PVector(50, 300);
  RV=new PVector(0, 0);
  LV=new PVector(0, 0);
  //serial = new Serial(this,"COM5",9600);//COM4可能會改
}
int Rx=0, Ry=0;
int Lx=0, Ly=0;
int sop=0;
void draw() {
  if (sop==0) {//景0op
    ground();//背景
    textSize(90);fill(0);
    text("start", 300, 320);
    if (mousePressed)sop=1;
    return;
  }else if (sop==1) {//景1
    t1=0;t2=0;

    downSpeed();
    ground();//背景
    ball();//球
    rebound();//反彈
    RUC();//右邊使用者控制
    LUC();//左邊使用控制
    Range();//使用者邊界
    if (t1>=1 || t2>=1)sop=2;
  }else if(sop==2){//景2ed
    ground();//背景
    if (t1>t2){
      fill(#FF1A44);
      rect(25, 50+20, 370, 460);
      textSize(90);fill(0);
      text("LOSE", 110, 320);
      fill(#00E3FF);
      rect(25+380, 50+20, 370, 460);
      fill(0);text("WIN", 500, 320);
    }else{
      textSize(90);
      fill(#00E3FF);
      rect(25, 50+20, 370, 460);
      fill(0);
      text("WIN", 120, 320);
      fill(#FF1A44);
      rect(25+380, 50+20, 370, 460);
      fill(0);text("LOSE", 490, 320);
    }
    textSize(90);fill(100);
    text("restart", 260, 520);
    if (mousePressed)sop=1;
    return;
  }
  
  /*Client temp=server.available();
  if (temp!=null) {
    client=temp;
  }if (client !=null) {
    String now=client.readString();
    if (now !=null) {String[] now2=splitTokens(now);}
  }*/
}
void keyReleased() {
  if (Rx==1)Rx=0;
  if (Ry==1)Ry=0;
  if (Lx==1)Lx=0;
  if (Ly==1)Ly=0;
}
void keyPressed() {
  if (keyCode == RIGHT) {
    RV.x=3;
    Rx=1;
  }if (keyCode == LEFT) {
    RV.x=-3;
    Rx=1;
  }if (keyCode == UP) {
    RV.y=-3;
    Ry=1;
  }if (keyCode == DOWN) {
    RV.y=3;
    Ry=1;
  }
  if (key == 'A'||key == 'a') {
    LV.x=-3;
    Lx=1;
  }if (key == 'D'||key == 'd') {
    LV.x=3;
    Lx=1;
  }if (key == 'W'||key == 'w') {
    LV.y=-3;
    Ly=1;
  }if (key == 'S'||key == 's') {
    LV.y=3;
    Ly=1;
  }
}void downSpeed() {
  if (Rx==0)RV.x*=0.98;
  if (Ry==0)RV.y*=0.98;
  if (Lx==0)LV.x*=0.98;
  if (Ly==0)LV.y*=0.98;
}
int RUBx=0, RUBy=0, LUBx=0, LUBy=0;

void RUC() {//右邊使用者控制

  fill(0, 0, 255);
  ellipse(RUC.x, RUC.y, 50, 50);
  /*fill(120, 0, 0);
   ellipse(RUC.x+25, RUC.y, 15, 15);ellipse(RUC.x-25, RUC.y, 15, 15);
   ellipse(RUC.x, RUC.y+25, 15, 15);ellipse(RUC.x, RUC.y-25, 15, 15);
   ellipse(RUC.x+15, RUC.y+15, 15, 15);ellipse(RUC.x+15, RUC.y-15, 15, 15);
   ellipse(RUC.x-15, RUC.y+15, 15, 15);ellipse(RUC.x-15, RUC.y-15, 15, 15);*/

  RUC.add(RV);
  //print(RUC.y+"\n");
}

void LUC() {//左邊使用控制
  fill(0, 0, 255);
  ellipse(LUC.x, LUC.y, 50, 50);

  //print(LUC.x+"\n");
  LUC.add(LV);
}
void ball() {
  fill(10);
  ellipse(ball.x, ball.y, 40, 40);
  fill(bc);
  ellipse(ball.x, ball.y, 15, 15);
  ball.add(bV);
}
void rebound() {//反彈
  if (ball.y>530-20 || ball.y<45+45) {
    bV.y*=-0.91;
    bc=255;
    RreBoundState=1;
    LreBoundState=1;
  }
  if (ball.x>800-45||ball.x<25+20) {
    if (ball.y>380) {
      bV.x*=-0.91;
      bc=10;
      RreBoundState=1;
      LreBoundState=1;
    }
    if (ball.y<220) {
      bV.x*=-0.91;
      bc=10;
      RreBoundState=1;
      LreBoundState=1;
    }
  } 

  if (RreBoundState==1) {
    reBound2(ball.x, ball.y, RUC.x+25, RUC.y);
    reBound2(ball.x, ball.y, RUC.x-25, RUC.y);
    reBound2(ball.x, ball.y, RUC.x, RUC.y+25);
    reBound2(ball.x, ball.y, RUC.x, RUC.y-25);
    reBound2(ball.x, ball.y, RUC.x+15, RUC.y+15);
    reBound2(ball.x, ball.y, RUC.x+15, RUC.y-15);
    reBound2(ball.x, ball.y, RUC.x-15, RUC.y+15);
    reBound2(ball.x, ball.y, RUC.x-15, RUC.y-15);
  }
  if (LreBoundState==1) {
    reBound3(ball.x, ball.y, LUC.x+25, LUC.y);
    reBound3(ball.x, ball.y, LUC.x-25, LUC.y);
    reBound3(ball.x, ball.y, LUC.x, LUC.y+25);
    reBound3(ball.x, ball.y, LUC.x, LUC.y-25);
    reBound3(ball.x, ball.y, LUC.x+15, LUC.y+15);
    reBound3(ball.x, ball.y, LUC.x+15, LUC.y-15);
    reBound3(ball.x, ball.y, LUC.x-15, LUC.y+15);
    reBound3(ball.x, ball.y, LUC.x-15, LUC.y-15);
  }
}
int RreBoundState=1, LreBoundState=1;
void SERIALV() {//做加速的
  if (bV.x>0) {
    if (RV.x<0) {bV.x+=RV.x*-1;
    } else{bV.x+=RV.x;}
  } else {
    if (RV.x<0) {bV.x+=RV.x;
    } else{bV.x+=RV.x*-1;
    }
  }
  if (bV.y>0) {
    if (RV.y<0) {bV.y+=RV.y*-1;
    } else{bV.y+=RV.y;
    }
  } else {
    if (RV.y<0) {bV.y+=RV.y;
    } else {bV.y+=RV.y*-1;
    }
  }
  
  if (bV.x>0) {
    if (LV.x<0) {  bV.x+=LV.x*-1;
    } else{  bV.x+=LV.x;  }
  } else {
    if (LV.x<0) {  bV.x+=LV.x;
    } else{ bV.x+=LV.x*-1; }
  }
  if (bV.y>0) {
    if (LV.y<0) {  bV.y+=LV.y*-1;
    } else{ bV.y+=LV.y; }
  } else {
    if (LV.y<0) { bV.y+=LV.y;
    } else {  bV.y+=LV.y*-1; }
  }
  if(bV.x>=5)bV.x=5;
  if(bV.y>=5)bV.y=5;
}

void reBound2(float a, float b, float c, float d) {
  if (a+20>=c-10 
    && a-20<=c+10 
    && b+20>=d-10 
    && b-20<=d+10
    ) {
    RreBoundState=0;
    LreBoundState=1;
    println(ball.x, ball.y, RUC.x, RUC.y);
    SERIALV();
    bV.x*=-1;
    bV.y*=-1;
    bc=150;
  }
  /*if (ball.x+20>=RUC.x-25 && ball.x-20<=RUC.x+25 
   && ball.y+20>=RUC.y-25 && ball.y-20<=RUC.y+25) {
   println(ball.x, ball.y, RUC.x, RUC.y);
   bV.x*=-1;bV.y*=-1;bc=100;delay(10);
   }*/
}
void reBound3(float a, float b, float c, float d) {
  if (a+20>=c-10 
    && a-20<=c+10 
    && b+20>=d-10 
    && b-20<=d+10
    ) {
    RreBoundState=1;
    LreBoundState=0;
    println(ball.x, ball.y, LUC.x, LUC.y);
    bV.x*=-1;
    bV.y*=-1;
    bc=50;
    SERIALV();
  }
}

void Range() {//使用者邊界
  if (ball.x<=45) {
    if (ball.y>380||ball.y<220) {

      println(ball.x, ball.y);
      ball.x=50;
    }
  }
  if (ball.x>=755) {
    if (ball.y>380||ball.y<220) {
      println(ball.x, ball.y);
      ball.x=750;
    }
  }
  if (ball.x<=10||ball.x>=790) {
    if (ball.y<380&&ball.y>220) {
      println(ball.x, ball.y);
      if (ball.x<=10) {
        ball.x=300;
        t1++;
        bV.x=1;
        bV.y=0;
      }
      if (ball.x>=790) {
        ball.x=500;
        t2++;
        bV.x=-1;
        bV.y=-0;
      }
      RreBoundState=1;LreBoundState=1;
      ball.y=300;
    }
  }
  if (ball.y>=510) ball.y=505;
  if (ball.y<=90) ball.y=95;

  if (RUC.x<=420) RUC.x=420;
  if (RUC.x>=750) RUC.x=750;
  if (RUC.y>=505) RUC.y=505;
  if (RUC.y<=95) RUC.y=95;

  if (LUC.x<=50) LUC.x=50;
  if (LUC.x>=370) LUC.x=370;
  if (LUC.y>=505) LUC.y=505;
  if (LUC.y<=95) LUC.y=95;
}
void ground() {//背景
  background(#09E34C);
  fill(0);
  rect(0, 0, 800, 50);
  rect(0, 550, 800, 50);
  textSize(45);
  fill(255);
  text(t1, 450, 40);
  text(t2, 300, 40);
  noStroke();
  fill(250);
  rect(400-5, 0, 10, 600);
  ellipse(400, 300, 170, 170);
  fill(#FFBC00);
  rect(0, 20+25, 800, 25);
  rect(0, 530, 800, 25);
  rect(0, 0, 25, 220); 
  rect(0, 380, 25, 220);
  rect(800-25, 0, 25, 220); 
  rect(800-25, 380, 25, 220);
  fill(#09E34C);
  ellipse(400, 300, 150, 150);
  fill(0);
}

沒有留言:

張貼留言

alanhc 互動技術-week17 [final]

回顧這學期的作品:  期中作業:LANDING:PLANET 賣點&特點: 炫麗的特效 物理(星球重力及降落)及粒子系統(噴射) 世界地圖可根據視角縮放 困難點: 重寫3次最終改寫成物件導向的CLASS寫法...