公共模块设计

在定义公共模块时,需要设置与各个模型类相对应的成员变量,并为这些成员变量设置相应的 get 与 set 方法。这样,在定义各个模型类时,既能减少重复代码的编写,又有利于代码的重复使用与维护。

在飞机大战游戏中,玩家飞机、导弹、敌机和空投物资均属于飞行中的物体,其共同特点就是会飞。因此,将玩家飞机、导弹、敌机和空投物资抽象为会飞的模型类。

开始游戏后,玩家飞机、导弹、敌机和空投物资将有各自的图片和初始位置。其中,图片有宽度和高度,初始位置则有图片左上角的 x、y 坐标决定。这样,就发现了会飞的模型类中的 5 个成员变量,分别是图片、图片的宽度、图片的高度、图片左上角的 x 坐标和图片左上角的 y 坐标。为这些成员变量设置相应的 get() 与 set() 方法的代码如下:

import java.awt.image.BufferedImage;

public abstract class FlyModel {
    protected BufferedImage image;   // 图片
    protected int x;                 // 图片左上角的 x 坐标
    protected int y;                 // 图片左上角的 y 坐标
    protected int width;             // 图片的宽度
    protected int heigh;             // 图片的高度

    // 使用 get() 和 set() 方法封装模型类中的属性
    ...
}

除此之外,会飞的模型类还包括了以下内容:玩家飞机、导弹、敌机和空投物资有各自的移动方式,是否可以移动到游戏面板外以及敌机、空投物资是否被导弹击中。因为抽象类中既可以有方法,也可以有抽象方法,所以表示上述内容的代码如下:

/**
* 会飞的模型的移动方法
*/
public abstract void move();

/**
* 会飞的模型是否移动到游戏面板外
*/
public abstract boolean outOfPanel();

/**
* 检查当前会飞的模型是否被导弹击中
* @param Ammo 导弹对象
*/
public boolean shootBy(Ammo ammo) {
    int x = ammo.x;      // 导弹图片左上角的 x 坐标
    int y = ammo.y;      // 导弹图片左上角的 y 坐标
    return this.x < x && x < this.x + width && this.y < y && y < this.y + height;
}