Java中的行星万有引力

时间:2016-04-24 03:49:13

标签: java game-physics

我正在做一个简单的游戏,它会让一艘太空飞船被重力吸引到屏幕中央的一颗星星上。到目前为止,我的代码以一种根本不光滑的方式移动了矩形(很快就会成为火箭)。矩形也不会在到达星星时停止,而是在返回之前保持移动远远超过星星。

这是我的代码:

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。然后我将加速度值添加到Velocity变量xVel和yVel。

3 个答案:

答案 0 :(得分:1)

显然你通过

改变速度
yVel += ya;

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

如果你想保持速度不变,你可以

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

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

等同。这将使矩形可能在中心附近。请更新并提出新问题。

答案 1 :(得分:1)

你的宇宙飞船的运动看起来并不顺畅,因为它的移动与时间无关。如果在后台打开CPU密集型应用程序,并且Java进程的计算时间减少,会发生什么?现在你不经常打电话给move(),所以你的飞船突然减速了。

您需要跟踪自上次拨打move()以来已经过了多长时间 - 我确定您还记得高中物理公式,距离=速度*时间。有多种方法可以获得时间 - see here专门针对游戏进行讨论。

这会使运动平滑一点,但如果你想让机芯看起来像重力,那么你就不能单独使用速度 - 你还需要考虑加速度。您的太空飞船加速朝向该星星,因为它的&#39;重力。你的宇宙飞船越接近恒星,重力加速度就越强。这是另一种高中物理公式,你应该可以在网上找到它。

答案 2 :(得分:0)

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

如果您对以下

之类的变量进行了分解
int x;
int velX;

您无法获得平滑动画所需的精度(完全停止后没有任何内容)。使用整数5/2 == 2而不是2.5作为整数只能存储整数。这就是为什么你的动作不稳定。

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

float x = 0.0f; 
float vecX;

double x = 0.0;
double vecX;

这将为您提供您想要的平滑动作。