0

我正在制作非常简单的游戏。屏幕上有一个带枪的精灵,他朝鼠标指向的方向发射子弹。我用来执行此操作的方法是根据 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. 如果我在正确的轨道上,我如何“规范化”向量,使其保持不变,无论鼠标离精灵有多远?

提前致谢。

4

2 回答 2

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)。所以要调整速度,只需缩放矢量。

于 2013-02-13T04:45:28.763 回答
0

是的,这两个问题:

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

代码相当简单:

float magnitude = 3.0; // your max speed
float angle = Math.atan2(y,x);
Vector2D vector = new Vector(magnitude*sin(angle), magnitude*cos(angle));
于 2013-02-13T04:47:36.890 回答