JAVA飞机大战(三)

接着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;
        }
    }
  1. 在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); //处理鼠标滑动事件
}

你可能感兴趣的:(JAVA飞机大战(三))