空投物资模型设计

空投物资是会飞的模型类的子类,它们的运动轨迹与敌机和导弹不同,它们是斜飞入游戏面板中的。也就是说,空投物资既具有 x 轴方向的速度,又具有 y 轴方向的速度。此外,当空投物资移动至游戏面板的左右边缘时,空投物资不会移动到游戏面板外,而是与游戏面板发生碰撞后,反弹回来,继续移动,直至移动到游戏面板下边缘后消失。空投物资的图片如图23.12所示。

image 2024 03 06 17 51 02 981
Figure 1. 图23.12 空投物资

(1)因为空投物资既具有 x 轴方向的速度,又具有 y 轴方向的速度,所以要先予以定义。然后在空投物资类的构造方法中,初始化空投物资的图片、图片的宽度、图片的高度、图片左上角的 x 坐标和图片左上角的 y 坐标。与敌机的出现方式相同,当游戏开始时,空投物资的位置是随机出现的,因此需要借助 Random 类予以实现。代码如下:

import java.util.Random;public class Airdrop extends FlyModel {
    private int xSpeed = 1;   // 空投物资图片 x 坐标的移动速度
    private int ySpeed = 2;   // 空投物资图片 y 坐标的移动速度

    /**
    * 初始化数据
    */
    public Airdrop() {
        this.image = GamePanel.airdropImage;  // 空投物资的图片
        width = image.getWidth();             // 空投物资图片的宽度
        height = image.getHeight();           // 空投物资图片的高度
        y -= height;               // 游戏开始时,空投物资图片左上角的 y 坐标
        Random rand = new Random();   // 创建随机数对象
        // 初始时,空投物资图片左上角的 x 坐标(随机)
        x = rand.nextInt(GamePanel.WIDTH - width);
    }
}

(2)在空投物资类中,还有重写会飞的模型类中的 move() 方法和 outOfPanel() 方法。其中,在 move() 方法中,需要使用 if 语句实现当空投物资移动至游戏面板的左右边缘时,会与游戏面板发生碰撞后,反弹回来,继续移动的效果。move() 方法和 outOfPanel() 方法的代码如下:

public boolean outOfPanel() {
    return y > GamePanel.HEIGHT;
}

public void move() {
    x += xSpeed;
    y += ySpeed;
    if (x > GamePanel.WIDTH - width) {
        xSpeed = -1;
    }
    if (x < 0) {
        xSpeed = 1;
    }
}