今天開始,我們將要開始統合之前所學到的方法,在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);
}
沒有留言:
張貼留言