从2点获得子弹X到Y的移动比率

时间:2013-02-13 04:38:32

标签: java math angle projectile

我正在制作非常简单的游戏。屏幕上有一个带有枪的精灵,他按照鼠标指向的方向射出一颗子弹。我用来做这个的方法是根据2个点(精灵的中心和鼠标位置)找到X到Y的比例。 X与Y的比率基本上是“每次X改变1,Y改变__”。

到目前为止,这是我的方法:

public static Vector2f getSimplifiedSlope(Vector2f v1, Vector2f v2) {
    float x = v2.x - v1.x;
    float y = v2.y - v1.y;

    // find the reciprocal of X
    float invert = 1.0f / x;
    x *= invert;
    y *= invert;

    return new Vector2f(x, y);
}

然后将此Vector2f传递给子弹,每次移动该量。

但它不起作用。当我的鼠标直接位于精灵的上方或下方时,子弹的移动速度非常快。当鼠标位于精灵的右侧时,它们的移动速度非常慢。如果鼠标在左侧,则子弹射出右侧。

当我从混音中删除反转变量时,它似乎工作正常。所以这是我的两个问题:

  1. 我是否偏离轨道,并且有更简单,更清洁,更广泛使用等方式来做到这一点?
  2. 如果我在正确的轨道上,我如何“规范化”矢量,使其保持不变,无论鼠标离精灵有多远?
  3. 提前致谢。

2 个答案:

答案 0 :(得分:2)

使用矢量对您有利。我不知道Java的Vector2f类是否有这种方法,但这就是我的方法:

return (v2 - v1).normalize(); // `v2` is obj pos and `v1` is the mouse pos

要对矢量进行标准化,只需将其(即每个分量)除以整个矢量的幅度:

Vector2f result = new Vector2f(v2.x - v1.x, v2.y - v1.y);
float length = sqrt(result.x^2 + result.y^2);

return new Vector2f(result.x / length, result.y / length);

结果是单位矢量(其幅度为1)。因此,要调整速度,只需缩放矢量。

答案 1 :(得分:0)

对于这两个问题都是:

  • 找到你所谓的比率你可以使用 arctan 函数,该函数将提供从第一个对象到第二个对象的向量的角度
  • 将其标准化,因为现在您从一个角度开始,您不需要做任何事情:您可以直接使用polar coordinates

代码很简单:

float magnitude = 3.0; // your max speed
float angle = Math.atan2(y,x);
Vector2D vector = new Vector(magnitude*sin(angle), magnitude*cos(angle));