我的球,沒辦法做碰撞判定啊啊啊!
事情是這樣的,我發現我的子彈跟敵人都是陣列,沒辦法進行逐一判定。這是個大問題,真的。
所以我想要先把子彈的部分從陣列解放出來,有辦法嗎?其實也是很簡單,畢竟繪製這個東西本來就是從單個單個繪製開始的嘛。所以這其實只需要回歸原始,我們用布林函式來判定繪製與否,那就判定布林函式有沒有被啟動,若啟動就繪製,這樣就是一次一顆了,因為是個單體,我就能輕鬆賦予其顏色與座標等重要屬性了,這樣就離實現距離判定的時刻不遠了。
好,上程式碼:
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();
}
這是滑鼠按下時該做的事,其中的appear跟shoot兩布林函式分別代表繪製子彈與射擊子彈兩部分的控制,這是為了讓另外一個函式得以執行,也就是繪製下一顆球的函式。如果不知道下一顆球長怎樣,這遊戲也太難了,每顆要發射的球都是隨機上色,總不能用猜的吧?appear就是用在這裡的。他是用於控制繪製現在要發射出去的球的繪製,在它的值為true之前並不會繪製要發射的球的。
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();}
}
如上面的程式碼,我會先繪製下一顆球的顏色在原地,然後用一個函式操控生成顏色,然後在滑鼠按下時將下一顆球的顏色bnext指定給要發射的球的顏色bc,然後用random(1 ,5)再生成一個新的bnext繪製在原地。這就是繪製發射的方法了,
話題回到發射的部分,由於一次只繪製一顆子彈,所以我就能輕易地給予它獨立的x與y的座標量,以及顏色編號,這樣要進行判定真的會輕鬆很多。好啦,先這樣啦,下周見!
沒有留言:
張貼留言