質問
弾丸があらゆる方向に飛ぶことができるゲームを作ろうとしています。私はそれらを方向と大きさのベクトルにして、方向に進むようにします。これを実装する方法がわかりませんか?
ありがとう
解決
計算する必要がある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は画分を表します)。スカラーによるベクトル乗算は、各コンポーネントにスカラーを掛けることによって行われます...
よろしく、クリストフ
所属していません StackOverflow