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は弾丸に渡され、弾丸はフレームごとにその量を移動します。

しかし、それは機能していません。マウスがスプライトの真上または真下にある場合、弾丸は非常に速く移動します。マウスがスプライトの右側にある場合、マウスの動きは非常に遅くなります。そして、マウスが左側にある場合、弾丸はすべて同じように右側を発射します。

ミックスから反転変数を削除すると、正常に機能しているようです。だからここに私の2つの質問があります:

  1. 私は軌道から外れていますか?これを行うには、より単純で、よりクリーンで、より広く使用されているなどの方法がありますか?
  2. 正しい方向に進んでいる場合、マウスがスプライトからどれだけ離れていても同じままになるように、ベクトルを「正規化」するにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

2

あなたの利点にベクトルを使用してください。Vector2fJavaのクラスにこのメソッドがあるかどうかはわかりませんが、次のようにします。

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

はい、両方の質問について:

  • 比率と呼ぶものを見つけるには、最初のオブジェクトから 2 番目のオブジェクトに向かうベクトルの角度を提供する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 に答える