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;
这会给你想要的平滑运动。
我正在制作一个简单的游戏,其中有一艘 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;
这会给你想要的平滑运动。