我正在做一个简单的游戏,它会让一艘太空飞船被重力吸引到屏幕中央的一颗星星上。到目前为止,我的代码以一种根本不光滑的方式移动了矩形(很快就会成为火箭)。矩形也不会在到达星星时停止,而是在返回之前保持移动远远超过星星。
这是我的代码:
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。
答案 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;
这将为您提供您想要的平滑动作。