とてもシンプルなゲームを作っています。画面上に銃を持ったスプライトがあり、彼はマウスが指している方向に弾丸を発射します。これを行うために使用している方法は、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は弾丸に渡され、弾丸はフレームごとにその量を移動します。
しかし、それは機能していません。マウスがスプライトの真上または真下にある場合、弾丸は非常に速く移動します。マウスがスプライトの右側にある場合、マウスの動きは非常に遅くなります。そして、マウスが左側にある場合、弾丸はすべて同じように右側を発射します。
ミックスから反転変数を削除すると、正常に機能しているようです。だからここに私の2つの質問があります:
- 私は軌道から外れていますか?これを行うには、より単純で、よりクリーンで、より広く使用されているなどの方法がありますか?
- 正しい方向に進んでいる場合、マウスがスプライトからどれだけ離れていても同じままになるように、ベクトルを「正規化」するにはどうすればよいですか?
前もって感謝します。