公共模块设计
在定义公共模块时,需要设置与各个模型类相对应的成员变量,并为这些成员变量设置相应的 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;
}