根据角度和速度更新坐标

时间:2011-08-27 21:30:18

标签: java android math 2d

我在这里看到了很多关于这个谜语的答案,但每次我尝试实施答案时,它们似乎都不起作用。我想回答一些答案,但不能。也许是因为我的“声誉”水平?

无论如何,这是游戏的简单坐标问题。对大多数人来说很简单,但不适合我。 (吮吸数学......铁杆)

我在屏幕中间有一个太空飞船。它不会离开旋转(user.fAngle)。它确实有速度(user.dVelocity),纯粹用于计算它在世界上的位置。

现在我让船以1的速度移动。这意味着无论它在哪里移动,它都以该速度移动(再次,纯粹用于地图坐标)。不会减速或加速......但最终会。因此,速度最终将成为一个变化的变量。

这就是我现在所拥有的......

    double radians = (Math.PI / 180) * ( user.fAngle); 
    worldX = (int)(worldX + user.dVelocity * Math.cos(radians)); 
    worldY = (int)(worldY + user.dVelocity * Math.sin(radians));

user.fangle当然= 0-359

当你开始游戏时,

worldX和worldY从0开始。我试图根据船的角度和硬编码速度修改worldX和worldY每帧。

在大多数情况下,这是有效的。但奇怪的是,在某些时候,坐标会冻结。或者他们将停在0并且不会进入底片。同样,这仅在特定时间和某些角度发生。

我看到的另一个问题是,当数字发生变化时,它们总是以一致的速度变化。换句话说,让我们说北方是0.如果我以5的角度移动,那么worldY变量应该会发生很大的变化,但是worldX应该会有所改变。这种情况没有发生。

在我的调试中,我确保user.fAngle确实在0-359的范围内。我不确定还有什么要检查。

感谢阅读,感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

你的问题来自:

int x = 0;
x = x + 0.5; // rounding down : x == 0
x = x + 0.5; // rounding down : x == 0

你需要一个浮点变量来记住位置。

float x = 0;
x = x + 0.5; // x == 0.5
worldX = (int)x; // worldX == 0
x = x + 0.5; // x == 1
worldX = (int)x; // worldX == 1

这将解决问题。

答案 1 :(得分:0)

不确定这是否可行,但尝试将角度乘以PI,然后在将角度转换为弧度时除以180。

double radians = (Math.PI * user.fAngle) / 180; 

编辑:

我刚注意到worldX和worldY的类型为int。您应该将其类型更改为double,因为位移很可能是小数。

答案 2 :(得分:0)

  

“......让我们说北方是0.如果我以5°的角度移动世界   变量应该改变很多,但worldX应该改变一个   小。这种情况没有发生。“

你为X和Y运动提供的公式实际上假设北方是90度。

在三角学中,0度的角度沿着+ X轴,这对应于地图上的正东方。此外,在三角学中,增加角度会使其在原点周围逆时针。如果你想让你的角度像罗盘标题一样,北角为0度,东角为90度,依此类推,你应该像这样定义radians

double radians = (Math.PI / 180) * ( 90.0 - user.fAngle);