質問

弾丸があらゆる方向に飛ぶことができるゲームを作ろうとしています。私はそれらを方向と大きさのベクトルにして、方向に進むようにします。これを実装する方法がわかりませんか?

ありがとう

役に立ちましたか?

解決

計算する必要がある2つの部分があります。まず、合計距離から始めます。これは簡単でなければなりません:

total_distance = velocity * time

これが2Dゲームであると仮定すると、Sine&Cosineを使用して、合計距離をXコンポーネントとYコンポーネントとYコンポーネントに分割する必要があります。

distance_y = total_distance * sin(2 * pi * angle / 360)
distance_x = total_distance * cos(2 * pi * angle / 360)

最後に、弾丸の開始位置に基づいて距離x/yをオフセットする必要があります。

pos_x = distance_x + start_pos_x
pos_y = distance_y + start_pos_y

もちろん、これらすべてを素敵なクラスで包み、必要に応じて拡大および研磨することができます。

他のヒント

位置、方向ベクトル、速度を含む弾丸クラスを使用することができます。ステップのたびに、次のような弾丸の位置を更新できます。

position += direction * veclocity;

これは、方向がユニットベクトルであることを前提としています。

私はこのようなものから始めます:

struct Vector3f {
    float x, y, z;
};

struct Bullet {
    Vector3f position;
    Vector3f velocity;
};

inline const Vector3f& Vector3f::operator+=(const Vector &other)
{
    x += other.x;
    y += other.y;
    z += other.z;
    return *this;
}

inline const Vector3f& Vector3f::operator*=(float v)
{
    x *= v;
    y *= v;
    z *= v;
    return *this;
}

その後、弾丸の位置を更新できます bullet.position += velocity (ベクトルの追加は、コンポーネントを個別に追加することで行われます)。速度ベクトルには、方向と速度(=ベクトルの大きさ)の両方が含まれていることに注意してください。

そして、あなたの弾丸がフレームごとに遅くなるなら、あなたは次のようなことをすることができます bullet.velocity *= 0.98 (ここで、0.98は画分を表します)。スカラーによるベクトル乗算は、各コンポーネントにスカラーを掛けることによって行われます...

よろしく、クリストフ

これは何であれ?

http://www.cs.cmu.edu/~ajw/doc/svl.html

Googleは素晴らしいツールです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top