我正在制作非常简单的游戏。屏幕上有一个带有枪的精灵,他按照鼠标指向的方向射出一颗子弹。我用来做这个的方法是根据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传递给子弹,每次移动该量。
但它不起作用。当我的鼠标直接位于精灵的上方或下方时,子弹的移动速度非常快。当鼠标位于精灵的右侧时,它们的移动速度非常慢。如果鼠标在左侧,则子弹射出右侧。
当我从混音中删除反转变量时,它似乎工作正常。所以这是我的两个问题:
提前致谢。
答案 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)
对于这两个问题都是:
代码很简单:
float magnitude = 3.0; // your max speed
float angle = Math.atan2(y,x);
Vector2D vector = new Vector(magnitude*sin(angle), magnitude*cos(angle));