弾丸がどの方向にも飛べるゲームを作ろうとしています。私はそれらを方向と大きさのあるベクトルにして、それらを方向に向かわせるようにしたいと思います。これを実装する方法がわかりませんか?
ありがとう
弾丸がどの方向にも飛べるゲームを作ろうとしています。私はそれらを方向と大きさのあるベクトルにして、それらを方向に向かわせるようにしたいと思います。これを実装する方法がわかりませんか?
ありがとう
位置、方向ベクトル、および速度を含む弾丸クラスを持つことができます。ステップごとに、次のように弾丸の位置を更新できます。
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は分数を表します)。スカラーを使用したベクトル乗算は、各コンポーネントにスカラーを乗算することによって行われます。
よろしく、クリストフ
計算する必要がある2つの部分があります。まず、総距離から始めます。これは簡単なはずです:
total_distance = velocity * time
これが2Dゲームであると仮定すると、正弦波と余弦波を使用して、合計距離をXコンポーネントと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
もちろん、これらすべてを素敵なクラスにまとめ、必要に応じて拡張して磨くことができます。