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);
}
运行效果
除此之外,还可以给游戏设置音效、给敌机设置子弹、给玩家飞机设置生命值等功能。