Java 中的行星引力

Planetary Gravitation in Java

我正在制作一个简单的游戏,其中有一艘 space 飞船被屏幕中央的星星吸引。到目前为止,我使用的代码以一种根本不平滑的方式移动了矩形(很快就会变成火箭)。矩形在到达星星时也不会停止,而是在返回之前继续移动到星星之外。

这是我的代码:

public void move() {
    // Deals with gravity towards the center star

    if (x > game.getWidth() / 2) {
        xVel -= xa;
    }
    if (x < game.getWidth() / 2) {
        xVel += xa;
    }
    if (y > game.getHeight() / 2) {
        yVel -= ya;
    }
    if (y < game.getHeight() / 2) {
        yVel += ya;
    }

    x += xVel;
    y += yVel;
}

我首先计算火箭在屏幕上相对于中心的位置,然后根据需要更改其加速度值 xa 和 ya。然后我将加速度值添加到速度变量 xVel 和 yVel。

显然你改变了速度

yVel += ya;

等从你的措辞看来,这对你来说是可以接受的。但这将创造一个不断增加的速度(即最后飞过)。

如果你想保持速度恒定,你可以

if (x > game.getWidth() / 2) {
    xVel = -xa;
}

if (x < game.getWidth() / 2) {
    xVel = xa;
}

和等价物。这将使矩形可能围绕中心振荡。请更新并提出新问题。

你的space船的运动看起来不流畅,因为它的运动与时间无关。如果您在后台打开一个 CPU 密集型应用程序,并且您的 Java 进程获得更少的计算时间,会发生什么情况?现在您不再经常呼叫 move(),所以您的 space飞船突然减速。

您需要跟踪自上次调用 move() 以来已经过去了多少时间 - 我相信您还记得高中物理公式,距离 = 速度 * 时间。有多种方法可以获得时间 - see here 专门针对游戏的讨论。

这会稍微平滑运动,但如果您希望运动看起来像重力,则不能仅使用速度本身 - 您还需要考虑加速度。由于重力,您的 space 飞船正在 加速 飞向恒星。你的 space 飞船离恒星越近,重力加速度就越大。又是一个高中物理公式,网上应该能找到。

您没有提供所有代码,但对我来说,听起来您使用的是整数,而您应该使用浮点数或双精度数。

如果像下面这样对变量进行 decalre

int x;
int velX;

您将无法获得流畅动画所需的精度(句号后没有任何内容)。整数 5 / 2 == 2 而不是 2.5 因为整数只能存储整数。这就是为什么你会出现抖动。

您需要通过对浮点变量进行 decalring 来使用它们。

float x = 0.0f; 
float vecX;

double x = 0.0;
double vecX;

这会给你想要的平滑运动。