2021年12月27日 星期一

ᐇ Week16

Week16
本周进行跳上/落下板子的程式码,直接用if和Boolean进行判断。

1.跳上板子
利用if的判断,当四个条件全都成立时,方块会落在板子上,同时jumping的Boolean值变为false

int boardX=300;
int boardY=100;
int boardW=1000;
void setup(){
  size(500,300);
}
float x=30,y=150,vx=3,vy=0;
float scrolling=0;//相对运动
boolean jumping=false;
void draw(){
  background(#162390);
  line(0,200,500,200);
  rect(x-scrolling,y,50,50);
  x+=vx;
  if(jumping){
    y+=vy;
    vy+=0.98;
    if(y>150){//在地面
      y=150;vy=0;jumping=false;
    }
  }
  scrolling=(x-30);
  for(int i=0;i<1;i++){
    rect(boardX-scrolling,boardY,boardW,20);
    if(jumping && y+50<boardY && y+50+vy>boardY && boardX<x+50 && x<boardX+boardW){
      y=boardY-50;vy=0;jumping=false;//落在板子上
    }
  }
}
void keyPressed(){
  if(keyCode==UP){
    jumping=true;
    vy=-15;
  }
}

2.落下板子
增加Boolean值onBoard,如果onBoard为true且不超过板子右侧,则jumping为false,到一定边界方块会落下板子

int []boardX={300,400};
int []boardY={100,50};
int []boardW={800,300};
void setup(){
  size(500,300);
}
float x=30,y=150,vx=3,vy=0;
float scrolling=0;
boolean jumping=false,onBoard=false;
int boardID=0;
void draw(){
  background(#162390);
  line(0,200,500,200);
  rect(x-scrolling,y,50,50);
  x+=vx;
  if(jumping){
    y+=vy;
    vy+=0.98;
    if(y>150){
      y=150;vy=0;jumping=false;
    }
  }
  scrolling=(x-30);
  for(int i=0;i<2;i++){
    rect(boardX[i]-scrolling,boardY[i],boardW[i],20);
    if(boardID==i){
      if(onBoard==true && (boardX[i]+boardW[i]<x) ){//如果不在板子上会掉落
        onBoard=false;jumping=true;
      }
    }
    if(jumping && y+50<boardY[i] && y+50+vy>boardY[i] && boardX[i]<x+50 && x<boardX[i]+boardW[i]){
      y=boardY[i]-50;vy=0;jumping=false;onBoard=true;boardID=i;
    }
  }
}
void keyPressed(){
  if(keyCode==UP){
    jumping=true;
    vy=-15;
  }
}

3.geometry dash程式码

float []badx,bubblex,bubbley,boardx,boardy,boardw;
int now,score;
int boardID=0;
void setup(){
  size(600,400);
  textSize(40);
  badx=new float[100];
  badx[0]=300+random(200,300);
  for(int i=1;i<100;i++){
    badx[i]=badx[i-1]+random(200,250);
  }
  boardx=new float[100];
  boardx[0]=500+random(200,300);
  for(int i=1;i<100;i++){
    boardx[i]=boardx[i-1]+random(350,600);
  }
  boardy=new float[100];
  boardy[0]=260;
  for(int i=1;i<100;i++){
    boardy[i]=boardy[i-1]+random(-20,10);
  }
  boardw=new float[100];
  boardw[0]=100;
  for(int i=1;i<100;i++){
    boardw[i]=boardw[i-1]+random(20,50);
  }
  bubblex=new float[10];
  bubbley=new float[10];
  for(int i=0;i<10;i++){
    bubblex[i]=0;
    bubbley[i]=300;
  }
}
float usery=300, vy=0, bgx=0;
boolean gameOver=false;
boolean onBoard=false;
void draw(){
  background(#FF0A7D);
  bgx+=4;
  fill(#F5ADCF);
  for(int i=0;i<100;i++){
    now=i;
    if(collision()) gameOver=true;
    triangle(badx[i]-bgx,310,badx[i]-25-bgx,350,badx[i]+25-bgx,350);
}
  fill(#AD0051); rect(0,350,600,400);
  rect(150,usery,50,50);
  if(jumping){
    usery+=vy;
    vy+=0.98/2.5;
    if(usery>300){
      jumping=false;
      usery=300;
    }
  }
  fill(#AD0051);
  for(int i=0;i<100;i++){//新增程式码,跳跃中落在板子上
    rect(boardx[i]-bgx,boardy[i],boardw[i],20);
    if(boardID==i){
      if(onBoard==true && (boardx[i]+boardw[i]<150+bgx) ){
        onBoard=false;jumping=true;
      }
    }
    if(jumping && usery+50<boardy[i] && usery+50+vy>boardy[i] && boardx[i]<150+50+bgx && 150+bgx<boardx[i]+boardw[i]){
      usery=boardy[i]-50;vy=0;jumping=false;onBoard=true;boardID=i;
    }
  }
  for(int i=9;i>0;i--){
    bubblex[i]=bubblex[i-1];
    bubbley[i]=bubbley[i-1];
    ellipse(bubblex[i]+150-bgx,bubbley[i],10,10);
  }
  bubblex[0]=bgx;
  bubbley[0]=usery;
  if(gameOver==false){
  score=millis()/1000;
  fill(0);
  text("score: "+score,200,50);
  }
  else if(gameOver){
    background(0);
    fill(255,0,0);
    text("Goog luck next time!",100,100);
    text("score: "+score,200,150);
  }
}
boolean jumping=false;
void keyPressed(){
  if(jumping==false){
    jumping=true;
    vy=-10;
  }
}
boolean collision(){
   boolean b1=insideTriangle(150,usery);
   boolean b2=insideTriangle(200,usery);
   boolean b3=insideTriangle(200,usery+50);
   boolean b4=insideTriangle(150,usery+50);
   if(b1 || b2 || b3 || b4) return true;
   else return false;
}
boolean insideTriangle(float x,float y){
    float c1=cross(x,y,badx[now]-bgx,310,badx[now]-25-bgx,350);
    float c2=cross(x,y,badx[now]-25-bgx,350,badx[now]+25-bgx,350);
    float c3=cross(x,y,badx[now]+25-bgx,350,badx[now]-bgx,310);
    if(c1>=0 && c2>=0 && c3>=0) return true;
    else return false;
}
float cross(float xp,float yp,float x0,float y0,float x1,float y1){
  return (xp-x0)*(y1-y0)-(yp-y0)*(x1-x0);
}

沒有留言:

張貼留言