Java实现飞机大战小游戏(三)

day3 创建子弹

1. 设计子弹

Bullet类

因为子弹需要跟飞机一样放在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);
}

2. 加入子弹

为了提高玩家体验,我们给飞机设计火力属性(取值范围:1、2、3)

public int attackMode = 1;

所以根据飞机的火力不同,我们可以设计不同的子弹发射形式。

MyPanel类

对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);
	}
}

运行效果

你可能感兴趣的:(Java项目)