因为子弹需要跟飞机一样放在myPanel上,所以设置myPanel变量
public MyPanel nyPanel;
跟飞机一样我们需要设置子弹的宽高和坐标
public int width;
public int height;
public int x;
public int y;
就像飞机自身扇动翅膀的动作一样,为了看起来比较灵活,我们不停描绘不同状态的子弹图片,使得子弹看起来不断发生变化。
所以我们通过数组存放子弹的几个状态
public Image[] images = new Image[]{
Toolkit.getDefaultToolkit.getImage("images/bullet01.png"),
Toolkit.getDefaultToolkit.getImage("images/bullet02.png"),
Toolkit.getDefaultToolkit.getImage("images/bullet03.png")
};
使用变量imageindex来记录子弹状态
public imageindex = 0;
最后是画子弹,只观察一枚子弹:在自身状态不断变化的同时,y轴的位置不断发生变化。跟飞机一样使用一个drawSelf方法实现。
public void drawSelf(Graphics g){
g.drawImage(this.images[imageindex],x,y,width,height,null);
//每一毫秒,改变子弹状态同时子弹y坐标+1
if(this.myPanel.timer%1 == 0){
imageindex++;
if(imageindex == this.images.length)
imageindex=0;
y++;
}
//如果子弹超出界面,则移除该子弹
if(y < 0)
this.myPanel.bullets.remove(this);
}
因为子弹是放在JPanel容器中,子弹不可能只有一颗:飞机会不断发射子弹,而且子弹数量无法确定。所以,我们在MyPanel中用ArrayList存储每一颗子弹。
public ArrayList<Bullet> bullets = new ArrayList<Bullet>();
子弹超出界面后直接消失,如果不采取措施,这枚子弹即使不在界面里显示,也将一直存在,且占用内存,所以我们需要对每一颗子弹的y坐标进行判断,如果超出界面,则将该子弹移除。
public void drawSelf(Grapgics g){
if(y<0)
this.myPanel.bullets.remove(this);
}
为了提高玩家体验,我们给飞机设计火力属性(取值范围:1、2、3)
public int attackMode = 1;
所以根据飞机的火力不同,我们可以设计不同的子弹发射形式。
对MyPanel类的paintComponent方法进行修改,这里设计飞机火力=1时,飞机一次发射1颗子弹,飞机火力=2时,飞机一次发射3颗子弹,飞机火力=3时,飞机一次发射5颗子弹.
public void paintComponent(Graphics g){
//每隔100毫秒创建一次子弹
if(this.timer%100==0){
//根据飞机火力的不同,创建不同形式的子弹
if(this.player.attackMode == 1){
Bullet bullet = new Bullet(this);
//设置子弹的坐标
bullet.x = this.player.x + this.player.width/2 - bullet.width/2;
bullet.y = this.player.y - 15;
//存入ArrayList
this.bullets.add(bullet);
}
else if(this.player.attackMode == 2){
Bullet bullet1 = new Bulet(this);
this.bullets.add(bullet1);
Bullet bullet2 = new Bullet(this);
this.bullets.add(bullet2);
}
else if(this.player.attackMode == 3){
}
}
//画出所有子弹
for(int i = 0; i < this.bullets.size(); i++){
bullets.get(i).drawSelf(g);
}
}