我正在制作非常简单的游戏。屏幕上有一个拿着枪的 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 右侧时,它们移动速度非常慢。如果鼠标在左侧,子弹同样会从右侧射出。
当我从混合中删除反转变量时,它似乎工作正常。这是我的两个问题:
- 我是否偏离了轨道,是否有更简单、更清晰、更广泛使用等的方法来做到这一点?
- 如果我的方向正确,如何“标准化” 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/