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

day5 添加道具、分数

1. 设置道具

在我们的设计中,敌机被击灭后会掉落装备道具,不同的敌机掉落的道具也都不同,所以我们也像敌机父类一样,设计一个道具父类。

Item类

跟飞机、敌机、子弹一样都画在Panel上,所以

public Class Item{
	public MyPanel myPanel;
	public int width;
	public int height;
	public int x;
	public int y;
}

为了让道具看起来更灵活,我们让道具动态显示,也就是不停切换道具图片使得道具看起来不停在翻转。

public Image images;
//记录图片下标
public int imageindex = 0;

道具的翻转速度

public int imageSpeed;

道具的移动速度,道具不停向下移动,直至被玩家吃掉或飞出界面。

public int speed;

构造函数

public Item(MyPanel myPanel){
	this.myPanel = myPanel;
}
MyPanel类

因为我们的道具是在MyPanel上画的,试想一下,当敌机被击灭,道具装备从敌机消失的地方出现后,就会像子弹一样在游戏界面上运动,直至被玩家吃掉或飞出界面。那么我们在MyPanel类里用ArrayList存储画面里所有的道具。

public ArrayList<Item> items = new ArrayList<Item>();
Item类

此时我们定义drawSelf函数来画装备

public void drawSelf(Graphics g){
	g.drawImage(this.images[imageindex],x,y,width,height,null);
	//按照翻转速度进行翻转
	if(this.myPanel.timer%imageSpeed==0){
		imageindex++;
		if(imageindex==this.images.length)
			imageindex=0;
	}
	
	//按照速度进行向下移动
	if(this.myPanel.timer%speeed==0){
		y++;
		//飞出画面则从道具列表中移除该道具
		if(y>=BaseFrame.frameHeight)
			this.myPaenl.items.remove(this);
	}
}

对道具来说,如果被吃掉了,也要从道具列表中移除该道具,使用eated方法表示。

public void eated(){
	this.myPanel.items.remove(this);
}

2. 加入道具

敌机被击灭后,在敌机消失的地方出现敌机携带的道具,所以我们对敌机父类Enemy进行修改

Enemy类

释放道具

//存储敌机携带的道具
public Item items;
//修改killed函数
public void killed(){
	if(this.items!=null && this.items.length>0){
		for(int i=0; i<items.length; i++){
			Item item = this.items[i];
			
			item.y = this.y;
			item.x = this.x + 20*i +5;
			
			//将释放出来的item添加到panel中
			this.myPanel.items.add(item);
		}
	}
	this.myPanel.enemies.remove(this);
}

飞机碰到道具后,可以吸收掉

Player类

对drawSelf方法进行修改,判断玩家是否吃到道具。

public void drawSelf(Graphics g){
    //判断玩家是否吃到道具
	for(int i = 0; i<this.myPanel.items.size();i++){
		Item item = this.myPanel.items.get(i);	
    	if((this.x>=item.x-this.width && this.x<=item.x+item.width) &&(this.y>=item.y-			this.height && this.y<=item.y+item.height) )
    		item.eated();
	}
}

整个过程已经设计好,但对于装备的图片我们还没有设置过,因为不同的装备有不同的图片、宽高、速度等属性值,所以我们设计一个Item子类Item001.

Item001类
public Class Item001 extends Item{
	public Item001(MyPanel myPanel){
		super(myPanel);
		
		this.width = 15;
		this.height = 15;
		
		this.images=new Image[]{
				Toolkit.getDefaultToolkit().getImage("images/star01.png"),
				Toolkit.getDefaultToolkit().getImage("images/star02.png"),
				Toolkit.getDefaultToolkit().getImage("images/star03.png")
		};
		
		this.imageSpeed = (int)(Math.random()*20+5);
		
		this.speed = 3;
	}
}

装备类已经设置好,但是需要将具体的装备装载到具体的敌机上,所以我们对Enemy001类进行设置。

public Class Enemy001 extends Enemy{
	public Enemy001(MyPanel myPanel){
	this.items = new Item[]{
		new Item001(myPanel),
		new Item001(myPanel),
		new Item001(myPanel)
	};
	}
}

这样一来,每个Enemy001类型的敌机都会装载3个Item001类型的装备,在敌机被击灭后,会释放这3个装备,飞机在碰到这些装备后,装备就会消失。

运行效果

3. 设计分数

给玩家设置分数属性,每个道具自身携带一定数值的分数,当道具被飞机玩家吃掉的时候,对应的分数就加到飞机的分数属性上,同时在MyPanel上一直显示出来。

Player类
public int count = 0;
Item类
public int count;
public void eated(){
	this.myPanel.Player.count += this.count;
	this.myPanel.items.remove(this);
}
Item001类

在具体的道具类里设置具体分数值,每吃掉一个道具,增加相应分数。

public int count = 100;
MyPanel类

在MyPanel类里画上分数

public void drawSelf(Graphics g){
    //画分数
	g.setColor(Color.white);
	g.drawString(this.Player.count+"",BaseFrame.frameWidth-100,20);
}
运行效果

除此之外,还可以给游戏设置音效、给敌机设置子弹、给玩家飞机设置生命值等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值