接着JAVA飞机大战(二)继续写,在之前的文章中,已经创建好了窗口,可以显示出来英雄机,以及飞行物的显示.接下来实现飞行物的移动.
一、飞行物(敌机+小蜜蜂+子弹+英雄机)走一步
1.在FlyingObject类中添加抽象方法step();
,同时类也变成抽象类
注:因为每个飞行物的移动方式不同,所以定义抽象方法
public abstract class FlyingObject {
/** 飞行物走一步 */
public abstract void step();
}
2.在Airplane,Bee,Bullet,Hero类中重写step()
方法
/** 重写step()小敌机走一步 */
public void step(){
y+=speed; //y+(向下)
}
/** 重写step()小蜜蜂走一步 */
public void step(){
x+=xSpeed; //x+(向左或向右)
y+=ySpeed; //y+(向下)
if(x>=ShootGame.WIDTH-this.width){ //若蜜蜂的x>=(窗口宽-蜜蜂宽)时,xSpeed为负,即向左
xSpeed=-1;
}
if(x<=0){ //若x<=0时,xSpeed为正,即向右
xSpeed=1;
}
}
/** 重写step()子弹走一步 */
public void step(){
y-=speed; //y-(向上)
}
/** 重写step()英雄机走一步 */
public void step(){ //10毫秒走一次
image = images[index++/10%images.length]; //每100毫秒切换一次
}
3.在ShootGame的主程序的action()
方法中调用飞行物走一步的方法
/** 飞行物(敌机+小蜜蜂+子弹+英雄机)走一步 */
public void stepAction(){ //10毫秒走一次
hero.step(); //英雄机走一步
for(int i=0;i
二、子弹入场的实现
1.在Hero类中添加生成子弹的方法
/** 英雄机发射子弹--生成子弹对象 */
public Bullet[] shoot(){
int xStep = this.width/4; //1/4英雄机的宽
int yStep = 20; //固定的y值
if(doubleFire>0){ //双倍
Bullet[] bs = new Bullet[2]; //2发子弹
bs[0] = new Bullet(this.x+1*xStep,this.y-yStep); //x:英雄机x+1/4英雄机的宽 y:英雄机的y-yStep
bs[1] = new Bullet(this.x+3*xStep,this.y-yStep); //x:英雄机x+3/4英雄机的宽 y:英雄机的y-yStep
doubleFire-=2; //发一次双倍,则火力值减2
return bs;
}else{ //单倍
Bullet[] bs = new Bullet[1]; //1发子弹
bs[0] = new Bullet(this.x+2*xStep,this.y-yStep); //x:英雄机x+2/4英雄机的宽 y:英雄机的y-yStep
return bs;
}
}
- 在ShootGame主程序类中实现子弹入场
int shootIndex = 0; //子弹入场计数
/** 子弹入场(英雄机发射子弹) */
public void shootAction(){ //10毫秒走一次
shootIndex++; //每10毫秒增一次
if(shootIndex%30==0){ //每300(10*30)毫秒走一次
Bullet[] bs = hero.shoot(); //获取英雄机发射出来的子弹对象
bullets = Arrays.copyOf(bullets,bullets.length+bs.length); //扩容(bs有几个元素则扩大几个容量)\
System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); //数组的追加
}
}
3.在action()
中的run()
方法中调用shootAction();
三、英雄机的移动
1.在Hero类中定义moveTo
带参方法
/** 英雄机随着鼠标动 x:鼠标的x坐标 y:鼠标的y坐标*/
public void moveTo(int x,int y){
this.x = x-this.width/2; //英雄机的x=鼠标的x-1/2英雄机的宽
this.y = y-this.height/2; //英雄机的y=鼠标的y-1/2英雄机的高
}
2.在ShootGame类中添加监听器并处理鼠标移动事件
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
public void action(){
MouseAdapter l = new MouseAdapter(){
/** 处理mouseMoved()鼠标移动事件 */
public void mouseMoved(MouseEvent e){
int x = e.getX(); //获取鼠标的x坐标
int y = e.getY(); //获取鼠标的y坐标
hero.moveTo(x, y); //英雄机随着鼠标动
}
};
this.addMouseListener(l); //处理鼠标操作事件
this.addMouseMotionListener(l); //处理鼠标滑动事件
}