2022年1月17日 星期一

week13-哭啊轉守為攻(期末作品Geometry Dash完成)

 


聆聽輕快的音樂再搭配上緊張刺激的跑酷遊戲!💥

Geometry Dash是我很喜歡玩的遊戲💗
每次死掉重來都令人懊惱但又激發了玩家不服輸的性格😈
雖然我們的重製沒能做出像原作般與音樂的完美契合
但緊張刺激的跑酷部分還是有還原到😱
也搭配上原作的首關音樂
希望可以讓更多人認識這款遊戲🙏🙏

上鍵跳躍
下鍵作弊模式(不死)

每20分換背景與更新評價 40分封頂
隨著遊戲進行速度會越來越快

遊戲影片:

前面是正常遊玩 後半部作弊模式看40分以上

程式碼這邊看👈


import ddf.minim.*;
Minim minim;
AudioPlayer bgm,jump,gameover;
PImage img1,img2,img3,img4,img5,img6,img7;
PFont myFont;
float []badx,bubblex,bubbley,boardx,boardy,boardw,hboardx,hboardy,hboardw,trix,triy,rx,ry,md,mdt;
int now,score,now2;
int boardID=0;
int hboardID=0;
int rID=0;
void setup(){
  size(600,400);
  myFont = createFont("微軟正黑體",30);
  img1=loadImage("bg.jpg");
  img2=loadImage("gg.png");
  img3=loadImage("good.png");
  img4=loadImage("bg2.jpg");
  img5=loadImage("bg3.png");
  img6=loadImage("start.jpg");
  img7=loadImage("block.png");
  minim = new Minim(this);
  gameover = minim.loadFile("gameover.wav");
  jump = minim.loadFile("jump.mp3");
  bgm = minim.loadFile("BGMG.mp3");
  textSize(40);
  badx=new float[1000];
  badx[0]=350+250;
  for(int i=1;i<1000;i++){
    if(i%5==0 || i%8==0 || i%11==0) {badx[i]=badx[i-1]+random(200,300);}
    else {badx[i]=badx[i-1]+random(50,55);}
  }
  boardx=new float[100];
  boardx[0]=380+250;
  for(int i=1;i<100;i++){
    boardx[i]=boardx[i-1]+random(360,440);
  }
  boardy=new float[100];
  boardy[0]=260;
  for(int i=1;i<100;i++){
    if(boardy[i-1]>=270){boardy[i]=boardy[i-1]-20;}
    else if(boardy[i-1]<=230){boardy[i]=boardy[i-1]+20;}
    else boardy[i]=boardy[i-1]+random(-20,10);
  }
  boardw=new float[100];
  boardw[0]=140;
  for(int i=1;i<100;i++){
    boardw[i]=boardw[i-1]+random(-20,10);
    if(boardw[i-1]<=80){boardw[i]=boardw[i-1]+30;}
  }
  hboardx=new float[90];
  //hboardx[0]=boardx[2]+160;
  for(int i=0;i<90;i++){
    //hboardx[i]=hboardx[i-1]+random(300,380);
    hboardx[i]=boardx[i+2]+random(200,210);
  }
  trix=new float[180];
  for(int i=0;i<180;i++){
   if(i%2==0) trix[i]=hboardx[i/2]+50;
   else trix[i]=hboardx[(i-1)/2]+50+50;
  }
  hboardy=new float[90];
  hboardy[0]=150;
  for(int i=1;i<90;i++){
    if(hboardy[i-1]>=170){hboardy[i]=hboardy[i-1]-20;}
    else if(hboardy[i-1]<=120){hboardy[i]=hboardy[i-1]+20;}
    else hboardy[i]=hboardy[i-1]+random(-20,10);
  }
  triy=new float[180];
  triy[0]=150+20;
  for(int i=1;i<180;i++){
   if(i%2==0) triy[i]=hboardy[i/2]+20;
   else triy[i]=hboardy[(i-1)/2]+20;
  }
  hboardw=new float[90];
  hboardw[0]=150;
  for(int i=1;i<90;i++){
    hboardw[i]=hboardw[i-1];
  }
  rx=new float[50];
  for(int i=0;i<50;i++){
    rx[i]=boardx[i+8]+boardw[i+8]+10;
  }
  ry=new float[50];
  for(int i=0;i<50;i++){
    ry[i]=170;
  }
  md=new float[90];
  for(int i=0;i<90;i++){
    md[i]=random(0.3,0.6);
  }
  mdt=new float[180];
  for(int i=0;i<180;i++){
    mdt[i]=(md[i/2]/0.4001)*0.1335;
  }
  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, speed=0;
//md=0.4001,mdt=0.1335;
boolean gameOver=false;
boolean onBoard=false;
boolean onhBoard=false;
boolean onr=false;
int condition=0;
int wait=0;
void mousePressed(){///場景切換
  if (mouseButton == LEFT) condition=1;
}
void draw(){
  if(condition==0){
    image(img6,0,0,600,400);
    fill(255);
    text("按下滑鼠左鍵開始遊戲",150,50);
    text("上鍵跳躍 下鍵無敵",170,350);
    textFont(myFont);
    wait=millis()/1000;
  }
  if(condition==1){
    if(gameOver && hacking==false) bgm.pause();
    else bgm.play();
    if(score>=0 && score<30) image(img1,0,0,600,400);
    if(score>=20 && score<40) image(img4,0,0,600,400);
    if(score>=40) image(img5,0,0,600,400);
    
    speed=(score/4)*0.2;
    bgx=bgx+3+speed;
    fill(#F5ADCF);
    for(int i=0;i<1000;i++){
      now=i;
      if(collision()) gameOver=true;
      triangle(badx[i]-bgx,310,badx[i]-25-bgx,350,badx[i]+25-bgx,350);
  }
    fill(#F5ADCF);
    for(int i=0;i<180;i++){
      now2=i;
      if(collision2()) gameOver=true;
      triangle(trix[i]+25-bgx,(triy[i]+=mdt[i])+40,trix[i]-bgx,triy[i]+=mdt[i],trix[i]+50-bgx,triy[i]+=mdt[i]);
      if(triy[i]<130) mdt[i]=abs(mdt[i]);
      if(triy[i]>280) mdt[i]=-abs(mdt[i]);
    }
    fill(#003E6C); rect(0,350,600,400);
    fill(#FFEC17);
    image(img7,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;
      }
    }
    fill(#AD0051);
    for(int i=0;i<90;i++){
      hboardy[i]+=md[i];
      rect(hboardx[i]-bgx,hboardy[i],hboardw[i],20);
      if(hboardy[i]<110) md[i]=abs(md[i]);
      if(hboardy[i]>260) md[i]=-abs(md[i]);
      if(hboardID==i){
        if(onhBoard==true && (hboardx[i]+hboardw[i]<150+bgx) ){
          onhBoard=false;jumping=true;
        }
      }
      if(jumping && usery+50<hboardy[i] && usery+50+vy>hboardy[i] && hboardx[i]<150+50+bgx && 150+bgx<hboardx[i]+hboardw[i]){
        usery=hboardy[i]-50;vy=0;jumping=false;onhBoard=true;hboardID=i;
      }
    }
    if(onhBoard==true) usery+=md[hboardID];
    fill(#AD0051);
    for(int i=0;i<50;i++){
      rect(rx[i]-bgx,ry[i],70,20);
      if(rID==i){
        if(onr==true && (rx[i]+70<150+bgx) ){
          onr=false;jumping=true;
        }
      }
      if(jumping && usery+50<ry[i] && usery+50+vy>ry[i] && rx[i]<150+50+bgx && 150+bgx<rx[i]+70){
        usery=ry[i]-50;vy=0;jumping=false;onr=true;rID=i;
      }
    }
    for(int i=9;i>0;i--){
      bubblex[i]=bubblex[i-1];
      bubbley[i]=bubbley[i-1];
      fill(#FFF586);
      rect(bubblex[i]+150-bgx,bubbley[i]+40,10,10);
    }
    bubblex[0]=bgx;
    bubbley[0]=usery;
    if(hacking){
      fill(255,0,0);
      text("作弊中",150,100);
    }
    if(gameOver==false || hacking){
    score=millis()/1000-wait;
    if(score<20) text("分數: "+score+"分  你好菜",150,50);
    else if(score<40) text("分數: "+score+"分  還不錯",150,50);
    else if(score>=40) text("分數: "+score+"分  不可思議",150,50);
    }
    else if(gameOver && hacking==false){
      gameover.play();
      background(255);
      image(img2,0,0,600,350);
      fill(255,0,0);
      if(score<20) text("評價:你好菜",220,50);
      else if(score<40) text("評價:還不錯",220,50);
      else if(score>=40) text("評價:不可思議",220,50);
      text("最終得分: "+score+"分",200,350);
    }
  }
}
boolean jumping=false;
boolean hacking=false;
void keyPressed(){
  if(keyCode==DOWN){
    if(hacking==false){
      hacking=true;
    }
  }
  if(keyCode==UP){
    jump.rewind();
    jump.play();
    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;
}
boolean collision2(){
   boolean t1=insideTriangle2(150,usery);
   boolean t2=insideTriangle2(200,usery);
   boolean t3=insideTriangle2(200,usery+50);
   boolean t4=insideTriangle2(150,usery+50);
   if(t1 || t2 || t3 || t4) return true;
   else return false;
}
boolean insideTriangle2(float x,float y){
    float tc1=cross(x,y,trix[now2]+25-bgx,triy[now2]+40,trix[now2]-bgx,triy[now2]);
    float tc2=cross(x,y,trix[now2]-bgx,triy[now2],trix[now2]+50-bgx,triy[now2]);
    float tc3=cross(x,y,trix[now2]+50-bgx,triy[now2],trix[now2]+25-bgx,triy[now2]+40);
    if(tc1<=0 && tc2<=0 && tc3<=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);
}

沒有留言:

張貼留言