2022年1月17日 星期一

常闇的程式之路week 17

 我的作品也做得差不多了,這次做的作品是泡泡龍的小遊戲,雖然做了滿久的,但還是有些BUG存在。話不多說直接上程式碼吧ˊˇˋ


import ddf.minim.*;

Minim minim;

AudioPlayer BGM;

AudioPlayer GG;

AudioPlayer Hit;

PFont F;

float bx;//發射球之x座標

float by;//發射球之y座標

float bvx;//發射球之x方向速度

float bvy;//發射球之y方向速度

int bc = 0;//目前發射球之顏色

int []ec = new int [1000];//所有敵人顏色編號資料 *重要資料*

int bnext = 0;//下一顆發射球之顏色

int enemy[];//敵人數量,最多11行

float []ex = new float[1000];//所有敵人的x座標資料 *重要資料*

float []ey = new float[1000];//所有敵人的y座標資料 *重要資料*

//float []nx = new float [4];//發射球黏上敵人陣列後偵測上下左右敵人x座標 *重要資料*

//float []ny = new float [4];//發射球黏上敵人陣列後偵測上下左右敵人y座標 *重要資料*

boolean shoot = false;//觸發子彈發射

boolean appear;//觸發子彈繪製

float nearx = 10000;//距離發射求最近之敵人x座標 *重要資料*

float neary = 10000;//距離發射求最近之敵人y座標 *重要資料*

float near = 10000;//距離發射求最近之敵人歐幾理德距離 *重要資料*

int bulletsize = 50;//發射球之直徑參數 *重要資料*

int r = 50;//所有敵人之直徑參數 *重要資料*

int N = 0;//敵人總數

float []dx = new float[1000];//應該死掉的球x座標

float []dy = new float[1000];//應該死掉的球y座標

float []dc = new float[1000];//應該死掉的顏色標號

void setup(){

  size(550 ,600);

  minim=new Minim(this);

  BGM=minim.loadFile("Video Game Blockbuste.mp3",1024);

  BGM.play();

  BGM.loop();

  F = createFont("18thCentury" ,80);

  for(int i = 0 ;i <= 70 ;i++){

      ec[i] = int(random(1 ,5));//給予所有位址隨機1~5整數以作為上色標準,0為空格

  }

  for(int i = 1 ;i <= 7 ;i++){

    for(int j = 1 ;j <= 10 ;j++){

      N++;

      ex[N-1] = j * r;ey[N-1] = i * r;

    }

  }

  newbullet();

  bnext = int(random(1 ,5));

}


void draw(){

  background(#242DFF);

  fill(#FFB624);rect(100 ,100 ,350 ,350);

  for(int i = 0 ;i < N ;i++){

    if(ec[i] == 1) {fill(#FC8585);ellipse(ex[i] ,ey[i] ,r ,r);}//紅

    if(ec[i] == 2) {fill(#FAFA86);ellipse(ex[i] ,ey[i] ,r ,r);}//黃

    if(ec[i] == 3) {fill(#86FA9C);ellipse(ex[i] ,ey[i] ,r ,r);}//綠

    if(ec[i] == 4) {fill(#8696FA);ellipse(ex[i] ,ey[i] ,r ,r);}//藍

    if(dist(bx ,by ,ex[i] ,ey[i]) < r){

      shoot = false;

      appear = false;

      N++;

      near = (dist(nearx * r ,neary * r ,bx ,by));

      for(int k = 1 ;k <= 10 ;k++){

        for(int l = 1 ;l <= 11 ;l++){

          if(dist(l * r ,k * r ,bx ,by) < near){

            nearx = l;

            neary = k;

            near = dist(nearx * r ,neary * r ,bx ,by);

            ex[N-1] = nearx * r;

            ey[N-1] = neary * r;

            ec[N-1] = bc;

            dx[N-1] = ex[N-1];

            dy[N-1] = ey[N-1];

            dc[N-1] = ec[N-1];

            S_Hit();

            if(ey[N-1] == 10 * r) {gameover();}

          }  

        }

      }

      for(int a = N-2 ;a >= 0 ;a--){

        if(ec[a] == dc[N-1] && dist(dx[N-1] ,dy[N-1] ,ex[a] ,ey[a]) <= 1.4*r){

          println(ex[N-1] ,ey[N-1] ,ec[N-1]);

          //ec[a] = 0;

          ex[N-1] = 1000;

          ey[N-1] = 1000;

          dx[N-1] = ex[a];

          dy[N-1] = ey[a];

          ex[a] = 1000;

          ey[a] = 1000;

        }

      }

      for(int a = 0 ;a <= N-2 ;a++){

        if(ec[a] == dc[N-1] && dist(dx[N-1] ,dy[N-1] ,ex[a] ,ey[a]) <= 1.4*r){

          println(ex[a] ,ey[a] ,ec[a]);

          //ec[a] = 0;

          ex[N-1] = 1000;

          ey[N-1] = 1000;

          dx[N-1] = ex[a];

          dy[N-1] = ey[a];

          //dc[N-1] = ec[a];

          ex[a] = 1000;

          ey[a] = 1000;

        }

      }

      newbullet();

    }

    if(ey[N-1] == 10 * r) {

      gameover();

      appear = false;

      bnext = 0;

      M_Stop();

      break;

    }

  }

  if(bnext == 1) {fill(#FC8585);ellipse(275,575 ,bulletsize ,bulletsize);}

  if(bnext == 2) {fill(#FAFA86);ellipse(275,575 ,bulletsize ,bulletsize);}

  if(bnext == 3) {fill(#86FA9C);ellipse(275,575 ,bulletsize ,bulletsize);}

  if(bnext == 4) {fill(#8696FA);ellipse(275,575 ,bulletsize ,bulletsize);}

  

  if(appear){

    if(bc == 1) {fill(#FC8585);ellipse(bx,by ,bulletsize ,bulletsize);}

    if(bc == 2) {fill(#FAFA86);ellipse(bx,by ,bulletsize ,bulletsize);}

    if(bc == 3) {fill(#86FA9C);ellipse(bx,by ,bulletsize ,bulletsize);}

    if(bc == 4) {fill(#8696FA);ellipse(bx,by ,bulletsize ,bulletsize);}

    if(shoot){

      bx+=bvx;

      by+=bvy;

      if(bx >= width-(bulletsize/2) || bx <= bulletsize/2) {bvx=-(bvx);S_Hit();}

      

      if(by >= height-(bulletsize/2) || by <= bulletsize/2) {bvy=-(bvy);S_Hit();}

    }

  }

}

void newbullet(){

  bx=275;

  by=575;

}


void gameover(){

  background(255);

  fill(0);

  textFont(F);

  text("GAME OVER" ,100 ,300);

  minim=new Minim(this);

  GG=minim.loadFile("Sad Trombone.mp3",1024);

  GG.play();

}


void nextbullet(){

  bnext = int(random(1 ,5));

}

void M_Stop()

{

  BGM.close();

  minim.stop();

  super.stop();

}

void S_Hit(){

  minim=new Minim(this);

  Hit=minim.loadFile("Pop sound effect.mp3",1024);

  Hit.play();

}

void mousePressed(){

  appear=true;

  shoot=true;

  bc = bnext;

  float dx=mouseX-275, dy=mouseY-575;

  float len=sqrt(dx*dx + dy*dy);

  bvx = dx*10/len;

  bvy = dy*10/len;

  nextbullet();

}

這是遊戲的外觀:

大致上就是這樣,雖然該消的球似乎沒辦法每次都完整消光,音樂到後期好像也會有點問題,但遊戲性還是沒啥大問題,我應該還會用點時間把這部分完善,就這樣囉ˊˇˋ




沒有留言:

張貼留言