写在最前面

1、本项目的目的不是为了开发游戏,而是为了领悟面向对象以及对基础语法的全面深刻认识,也就是说,只要你学完面向对象和基础语法就完全可以写出来一套完整的飞机大战游戏。
2、本项目适应于初学者,建议按照以下步骤来进行程序编写,尤其是基础薄弱,更要对照代码,按步骤一步步来实现每一个功能。

代码功能实现

首先要明白三个东西,窗口Jframe(你也可以想象成相框)、面板Jpanel(你也可以比喻成相框里面的画板)、画笔Graphics(用来往画板上画图片的工具)
1、先把窗口在main中写出来

public class World extends JPanel{//先创建主类World
public static void main(String[] args) {
        JFrame frame = new JFrame();//在内存中new一个窗口
        frame.setSize(520, 854);//有了窗口,当然要设置窗口的大小
        frame.setLocationRelativeTo(null);//窗口大小有了,自然要设置窗口的位置:居中
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);//由于窗口默认点关闭后,程序仍然在内存中运行,故设置关闭后停止程序
        frame.setTitle("飞机大战_郝大侠");//设置窗口的名字
        frame.add(getWorld());//另外把world类事件添加到窗口中
        frame.setVisible(true);//由于窗口默认不显示,故设置显示窗口
        getWorld().action();//执行world类中的action方法

    }
}

2、面板
在world类中继承jpanel

public class World extends JPanel{
    ...
}

3、画笔
由于本次项目,需要画笔的有:sky(天空:背景图)、airplane(小飞机)、bee(蜜蜂)、BigPlane(大飞机)、hero(英雄机)、bullet(子弹);同时它们还有一个共同特点就是移动;
故我们可以采用父类FlyObject继承的方法实现这个子类共同方法;

public abstract class FlyObject{//创建父类Flyobject

public abstract void paint(Graphics g);//画笔的抽象方法
public abstract void move();//抽象函数move();

/*这里说明为什么采用抽象方法 1、抽象方法必须被继承 2、抽象方法没有具体的实现方法,只能在子类中添加实现方法 3、抽象方法中可以被父类直接管理所有子类的抽象方法(多态) */
}

4、对整个项目类进行详细说明
World类:包含main类
Sky类:background图交替运动;以及各类bee、airplane、bigplane、hero、bullet的运动;
FlyObject类:作为各运动子类的父类;
两类抽象方法:move()、Graphics ();
类成员变量:实例变量、常量、类变量;(在加载类的同时加载类成员变量) int x,y(运动的坐标),width,hight(飞行物的宽度、高度);
Award接口:定义常量、只有定义没有实现的方法;(成绩、生命数)
5、对各个子类进行详细代码

FlyObject类

1、先定义成员变量:变量在初始化类的同时,被定义;
        flywidth、flyhigh、x、y、image、lifestatus;
2、定义含参构造函数:构造函数在初始化类对象的时候同时加载;为了初始化成员变量;
public class abstract FlyObject{//由于具有抽象方法,故称为抽象类
    int flywidth;int flyhight;//飞行物的图片
    int x; int y;//飞行物运动坐标
    BufferedImage image;//图片流

    public class FlyObject(){}//由于有了含参构造器,故无默认空构造器;为了new FlyObject()一个空对象,故设置一个空构造函数;
    public class FlyObject(BufferedImage ima,int x,int y,int width,int higth){//初始化成员变量
    this.x = x;
    this.y = y;//this代表本类的对象;
    flywidth = width;
    flyhigh = high;
    image = ima;
    }

public abstract void move();
public abstract void paint(Graphics g);//导入import java.awt.Graphics包

public void nextImage(){}//切换图片的方法
}

Sky类

1、背景图的move();
2static:类加载前执行一次;
public class Sky{
    double width = 580;
    double hight = 480;
    int y1 = 0;//成员变量必须被初始化才能使用
    static BufferedImage ima;
    public Sky(){
        super(ima,0,0,Sky.width,Sky.hight);//初始化成员变量
    }

    static{
        try{
        String png = "images/bg.jpg";//将路径定义为字符串
        ima = ImageIO.read.(Sky.class.getclassLoader().getResourceAsStream(png));
        png = "images/pause.png";
            pause = ImageIO.read(Sky.class.getClassLoader().getResourceAsStream(png));
            png = "images/start.png";
            start = ImageIO.read(Sky.class.getClassLoader().getResourceAsStream(png));
            png = "images/game_over1.png";
            gameover = ImageIO.read(Sky.class.getClassLoader().getResourceAsStream(png));
            }catch(IOException e){
            e.printStackTrace();//io流必须抛出异常
        }
    }

    @Override  //只要是继承的都能用
    public void move() {//以左上角顶点(0,0)为起始点开始运动;
        y+=5;
        y1+=5;
        if(y> 854) {
            y=-854;
        }
        if(y1> 854) {
            y1=-854;
        }
    }

    @Override
    //paint 函数重载
    public void paint(Graphics g) {//重载函数paint,进行功能调用;
        g.drawImage(image, x, y, null);
        g.drawImage(image, x, y1, null);
    }
}