day4 创建敌机

1. 设计敌机

在我们的设计中,敌机可以有多种形式:不同的外观、飞行速度、生命力等。但是所有的敌机必定有许多共同点,所以我们首先设计一个敌机父类。

Enemy类

和飞机类一样,所有的敌机都是画在MyPanel上的,所以

public MyPanel myPanel;

设置敌机的宽高和坐标

public int width;
public int height;
public int x;
public int y;

设置敌机图片

public Image image;

设置敌机生命力为0后爆炸图片

java飞机大战放大之后就_java飞机大战放大之后就

public Image[] dieImages = new Image[]{
	Toolkit.fetDefaultToolkit().getImage("/images/die01.png"),
	Toolkit.getDefaultToolkit().getImage("/images/die02.png")
};
//爆炸图片下标
public int imageindex;

设置敌机生命值

public int hp;

设置敌机飞行速度

public int speed;

构造函数

public Enemy(MyPanel myPanel){
	this.myPanel = myPanel;
}

因为敌机不止一架,所以我们在MyPanel类里用ArrayList存储多架敌机

public Class MyPanel{
	public ArrayList<Enemy> enemys = new ArrayList<Enemy>();
}

敌机被击中的过程中,生命值是不断下降的,所以我们可以定义一个方法

public void underAttank(){
	//如果生命值不为零
	if(hp>0)
		hp--;
}

敌机生命值为0说明敌机已死,此时我们将当前敌机从敌机列表中移除

public void killed(){
	this.myPanel.enemies.remove(this);
}

使用drawSelf方法画敌机,首先判断当前敌机是否死亡,如果死亡,则实现爆炸效果,爆炸结束之后将当前敌机从敌机列表中移除。然后让敌机根据速度不断向下飞行,如果飞出界面,也将当前敌机从敌机列表中移除。

public void drawSelf(Graphics g){
	//判断敌机是否死亡
	if(hp>0)
		g.drawImage(image,x,y,width,height,null);
	else{
		//敌机死亡,此时切换成爆炸图片
		g.drawImage(dieImages[imageindex],x,y,45,45,null);
		//每隔10毫秒切换一次爆炸图片
		if(this.myPanel.timer%10==0){
			imageindex++;
			if(imageindex>this.dieImages.length){
				//杀死敌机
				killed();
			}
		}	
	}
    
    //敌机根据速度不断向下移动
    if(this.myPanel.timer%speed==0){
        y++
        //如果敌机飞出界面,则移除
        if(y>=BaseFrame.frameHeight)
            this.myPanel.enemies.remove(this);
    }
}
Enemy001类

所有的敌机父类Enemy已经设置完成,现在我们设计一个具体的敌机类,设置敌机的宽高、初始坐标、速度、生命值和敌机图片。

public Class Enemy001 extends Enemy{
	//构造函数
	public Enemy001(MyPanel myPanel){
		super(myPanel);
		
		this.width = 60;
		this.height = 40;
		//敌机的初始x坐标在范围内随机
		this.x = (int) (Math.random() * (BaseFrame.frameWidth - this.width));
		this.y = - this.height;
		
		this.speed = 3;
		this.hp = 3;
		
		this.image = Toolkit.getDefaultToolkit().getImage("images/enemy001.png");
	}
}

可以根据需要多设计几个敌机类

2. 加入敌机

MyPanel类

因为有不同的敌机类型,所以我们用ArrayList存放所有的敌机类型

public ArrayList<Class> enymyType = new ArrayList<Class>();

修改MyPanel的paintConponent方法,画飞机、子弹后画敌机,每隔200毫秒创建一架敌机,且创建的敌机类型随机。

public void paintComponent(Grapgics g){
	//每隔200毫秒创建一架敌机
	if(this.timer%200==0){
		if(this.enemyType.size()>0){
			//随机一种敌机类型对应的下标
			int index = (int)(Math.random()*this.enemies.size());
			Enemy enemy;
			//通过反射创建一个对象(根据类名)
			try{
				enemy = (Enemy)this.enemyType.get(index).getConstructors()[0].newInstance(new Object[]{this});
				//将创建出来的敌机对象存入ArrayList中
				this.enemies.add(enemy);
			}catch(InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e){
				e.printStackTrace();
			}
		}
	}
	
	//将所有的敌机画出来
	for(int i=0; i<enemies.size(); i++){
		this.enemies.get(i).drawSelf(g);
	}
}
BaseFrame类

最后我们在BaseFrame类中添加敌机类型

public Class BaseFrame{
	public BaseFrame(){
        this.myPanel.enemyType.add(Enemy001.class);
    }
}

可以根据需要多设计几种敌机类型,然后在BaseFrame中添加到enemyType里,即可实现不同类型敌机随机出现。

运行效果

java飞机大战放大之后就_java飞机大战放大之后就_02