飛機類游戲中子彈是必不可少的,他們數量很多且充斥著整個屏幕,這些隨機或者有著一定AI的小物體,實現起來不是總那麼容易,有時候你不得不考慮很多和效能有關的問題。我們之前定義了GameObject,很大程度上就是為了方便的重用Sprite,因為我們有很多的子彈,不可能沒增加一個子彈都是一個Sprite,我需要共享同一個Sprite。我們通過繼承GameObject來實現。
下面分析一下這個子彈類:
它將繼承自GameObject;
記錄子彈的個數;
一個子彈的狀態數組,記錄各個子彈的類型type,位置x,y,速度vx,vy,是否存活alive等等。
初始化子彈
一個繪制方法,將子彈畫到屏幕上。
一個碰撞檢測方法。
好了先這樣吧,以下是我們子彈類的定義,注意這種思想——重用Sprite,這很重要。(這裡參考了tony的很多設計)
public class Bullets extends GameObject {
private int[][] bullets;//子彈狀態數組
private int bulletstotal;//數組的length
private Random rnd;//隨機數
public static final int BULLET_TYPE_LEFT=0;//子彈初始化的位置類型
public static final int BULLET_TYPE_RIGHT=1;//分為上下左右四種
public static final int BULLET_TYPE_TOP=2;
public static final int BULLET_TYPE_BOTTOM=3;
private int width,height;//屏幕的高和寬,用於隨機子彈位置
public Bullets(Image img,int picwidth,int picheight,int bulletstotal,int width,int height) {
super(img,picwidth,picheight);
this.bulletstotal=bulletstotal;
bullets=new int[bulletstotal][6];
rnd=new Random();
this.width=width;
this.height=height;
}
public void initBullets(){//初始化子彈狀態數組
for (int i = 0; i < bullets.length; i++) {
initBullet(i);
}
}
private void initBullet(int i) {//初始化index號子彈
bullets[i][0] = (rnd.nextInt() & 0x7fffffff) % 4; //type
bullets[i][5] = 1; //alive 1表示存活, 0表示死去
switch (bullets[i][0]) {
case BULLET_TYPE_LEFT:
bullets[i][1] = -5;
bullets[i][2] = (rnd.nextInt() & 0x7fffffff) % height;