2021年11月22日 星期一

常闇的程式之路week 09

 今天開始,我們將要開始統合之前所學到的方法,在Process3上製作簡易的小遊戲。

首先我們製作一個能夠下墜的物體:


接著我們試著做出另一顆不一樣速度的物體:


真不錯,但是這樣如果想要更多物體,就要有更多得程式碼,這樣麻煩。所以我們可以試試陣列作法:


不過球過了框界之後也不會回來,我們想讓它們在框界裡頭彈跳的話,就得設定物體彈跳的條件,改變速度方向:


接著就是創造一個能夠與這些物體互動的可控物體囉:


在這裡我們放上了一個判定式,始可控的紅球在碰到其餘黃球時能使其消失,主要是設定兩物體在距離不超過50時,使用continue函式,跳過了繪製黃色球體的過程,並達到消失的效果。

接著我想要讓這程式碼成為一個有機制的遊戲,所以我希望這黃色的物體在被可控的紅色物體碰到後就永久消除:





我們使用布林涵式,來對上述觸碰事件判定,如果判定有碰到,便直接消除該物體並阻止其再繪製。

至於什麼是布林函式呢,布林函式是一種能夠判斷影響程式判斷的真假值,有true以及false兩種值。以下我們用一個小程式解釋概念:



以上面程式為例,我們用down作為布林函式的判斷變數,當滑鼠為按下時,down的值為false;而按下時,則為true。這便是基本的布林函式。

以下是示範用程式碼:

boolean down;//滑鼠按下

void setup(){

  size(500 ,300);

}


void draw(){

  if(mousePressed) down = true;

  else down = false;

  print(down);

  if(down) background(255 ,0 ,0);//紅

  else background(0 ,255 ,0);//綠

}

接下來我們要對於遊戲的程式碼進行更深的調整,讓它更加完整:


這裡我們針對所有變數的做法進行改進,我們將所有變數的陣列於setup區域中進行random化處理,並將球的生成數設定為N,這麼一來便可透過對N的設定,直接對所有與N相關的數值統一改變,random的設計也能進一步增加遊戲的隨機性。

不過這麼一來,程式就會變得非常複雜,這時我們可以使用一個新方法──class:


Class可以被視為一個獨立的函式,它的作用在於整合數個小物件,使之成為一個複合的大物件,這些被整合的小物件能夠透過在主函式中呼叫該Class,進行同時的使用。

既然我們成功精簡了程式碼,那我們就來加更多的難度吧,比如讓球在四面八方亂彈,而不是只有上下:


這裡我們給予x方向不同速度,讓它們能夠在左右的維度上移動。

雖然吃球的遊戲也不錯玩,但是還是閃子彈的遊戲刺激多了對吧。所以我們改一下程式碼,讓吃到球的情況變成遊戲結束的紅畫面:


首先讓子彈小點也多點,接著讓速度也慢點,設定子彈飛出後在隨機位置重生,保持場面上的子彈數量。接著設定碰到游標後進入紅色的gameover畫面,這樣就大功告成啦。

以下是全部的程式碼:

class Ball{//定義Ball物件

  float x ,y ,vx ,vy;

  boolean dead;

  Ball(){//建構同名物件

    reborn();

  }

  void reborn(){

    x = random(500);

    y = random(100 ,200);

    vy = random(-1 ,1);

    vx =random(-1 ,1);

    dead = false;

  }

  void draw(){

    if(dead == true) return;

    ellipse(x ,y ,10 ,10);

    if(dist(mouseX ,mouseY ,x ,y) < 10){

      gameOver = true;

    }

    y = y + vy;

    x = x + vx;

    if(y > 500 || y < 0) reborn();

    if(x > 500 || x < 0) reborn();

  }

}


Ball [] balls;


void setup(){

  size(500 ,500);

  balls = new Ball[100];

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

    balls[i] = new Ball();

  }

}

boolean gameOver = false;

void draw(){

  background(255);

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

    balls[i].draw();

  }

  if(gameOver) background(255 ,0 ,0);

}

沒有留言:

張貼留言