java - 从 2 点获取子弹 X 到 Y 的移动比率

标签 java math angle projectile

我正在制作非常简单的游戏。屏幕上有一个拿着枪的 Sprite ,他朝鼠标指向的方向发射子弹。我用来执行此操作的方法是根据 2 个点( Sprite 的中心和鼠标位置)找到 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 传递给项目符号,项目符号每帧移动该量。

但是它不起作用。当我的鼠标位于 Sprite 的正上方或正下方时,子弹移动得非常快。当鼠标位于 Sprite 右侧时,它们移动速度非常慢。如果鼠标在左侧,子弹同样会从右侧射出。

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

  1. 我是否偏离了轨道,是否有更简单、更清晰、更广泛使用等的方法来做到这一点?
  2. 如果我的方向正确,如何“标准化” vector ,使其无论鼠标距离 Sprite 多远都保持不变?

提前致谢。

最佳答案

利用 vector 来发挥你的优势。我不知道 Java 的 Vector2f 类是否有这个方法,但我的做法如下:

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

要标准化 vector ,只需将其(即每个分量)除以整个 vector 的大小即可:

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);

结果是单位 vector (其大小为1)。因此,要调整速度,只需缩放 vector 即可。

关于java - 从 2 点获取子弹 X 到 Y 的移动比率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14846477/

相关文章:

java - 从命令行读取时将空元素插入到 ArrayList 中

c++ - 计算出保存一个 int 需要多少字节的算法

c - 使用二进制搜索在 C 中查找数字的平方根

c++ - 如何在 C++ 中将一点移向另一点?

html - 使边框有一个 Angular

math - 获取两条 2d 线之间的角度。 (相对于线条的方向)

Java执行器服务连接池

java - entrySet() 如何在 HashMap 内部工作?

java - ServerSocket 毫无错误地失去连接

python-3.x - OpenCV 中测量角度的引用点是什么?