day4 创建敌机
1. 设计敌机
在我们的设计中,敌机可以有多种形式:不同的外观、飞行速度、生命力等。但是所有的敌机必定有许多共同点,所以我们首先设计一个敌机父类。
Enemy类
和飞机类一样,所有的敌机都是画在MyPanel上的,所以
public MyPanel myPanel;
设置敌机的宽高和坐标
public int width;
public int height;
public int x;
public int y;
设置敌机图片
public Image image;
设置敌机生命力为0后爆炸图片
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里,即可实现不同类型敌机随机出现。
运行效果