2

私は C++ と SFML で「小惑星」ゲームを作成しており、スムーズな勢いの減速と加速について疑問に思っています。元のゲームでは、方向に移動すると「勢い」が蓄積され、ボタンを押している間は増加し、離すと減少しました。私はこれの私自身のバージョンを始めました。現在sf::Vector2f、船の運動量を含む があります。それは否定的または肯定的です。問題は、スローダウンを適切に実装できないことです (まだスピードアップを試みていません)。私は次のことを試しました;

if (plr.momentum.x < 0) {
    plr.momentum.x++;
}
if (plr.momentum.x > 0) {
    plr.momentum.x--;
}
if (plr.momentum.y < 0) {
    plr.momentum.y++;
}
if (plr.momentum.y > 0) {
    plr.momentum.y--;
}

これにより、プレイヤーは移動後、ウィンドウの左上 (座標 0,0) にゆっくりとドラッグされます。これは、float がたとえば 0.05 である可能性があり、「0 より大きい」if ステートメントを満たすためだと思います。これから、1 をとって、マイナスの数にします。次の if ステートメントはそれに 1 を追加し、これが連続してループします。負xの勢いはあなたを左に動かし、負のy勢いはあなたを上に動かします。スムーズなスローダウンとスピードアップの背後にある方法論を知りたいです。

あなたが疑問に思っている/疑問に思っている場合に備えて、私は次のコードを使用して、その勢いに応じてプレーヤーを動かします。

playerSprite.move(plr.momentum);

SFML に慣れていない場合、sf::Vector2fにはと が.xあり、これらはで.y使用されます。プレーヤーを現在の位置に相対的に移動します。したがって、プレイヤーが (5,0) にいて、あなたがそうする場合、座標は (4,0) になります。.movesf::Sprite playerSprite.moveplayer.move(sf::Vector2f(-1,0))

編集:友人からの提案として、スローダウン用の次のコードがあります。減速は完璧に機能しますが、減速した後、再び左上に移動し始めます。これは何が原因ですか?

if (plr.xSlowdown < 0.f) {
    plr.xSlowdown += 0.1f;
}
if (plr.xSlowdown > 0.f) {
    plr.xSlowdown -= 0.1f;
}
if (plr.ySlowdown < 0.f) {
    plr.ySlowdown += 0.1f;
}
if (plr.ySlowdown > 0.f) {
    plr.ySlowdown -= 0.1f;
}

plr.xMomentum = floor(plr.xSlowdown);
plr.yMomentum = floor(plr.ySlowdown);
4

2 に答える 2

1

スラスターがオフのときに宇宙船の速度を落としたい場合は、ドラッグを追加する必要があります。

抗力は、速度に基づいて力を適用します。最も簡単な方法はF = -K v、抗力係数に対して行うことですK。したがって、船の運動量がとに保存されplr.xMomentumているplr.yMomentum場合、プログラムは次のようになります。

// note:  "dt" is your timestep;
//   if you don't have one, just choose some small value for "fraction", like 0.005
float fraction = drag_coefficient_K * dt;
plr.xMomentum -= fraction * plr.xMomentum;
plr.yMomentum -= fraction * plr.yMomentum;

スピードアップは、宇宙船の向きに基づいて行われます。

// note: "orientation" is the angle of your spaceship;
//   the units of orientation are determined by "angle_scale",
//   which should be chosen such that "angle_in_radians" is in radians...
float angle_in_radians = angle_scale * orientation;
float thrust_per_timestep = thrust_value * dt;
plr.xMomentum += thrust_per_timestep * cos(angle_in_radians);
plr.yMomentum += thrust_per_timestep * sin(angle_in_radians);

抗力と推力の組み合わせは、達成できる速度に効果的に上限を設定します(少なくとも重力アシストなどなしで...)。

于 2012-10-15T23:16:47.537 に答える
0

あなたが望むのは物理学です。非常に単純な物理学: F=ma.

加速度、速度、および位置の概念が必要です。ユーザー入力によって加速度が決まります。加速度は速度を変化させ、速度は位置を変化させます。

余談: スローダウンとスピードアップに違いはありません。どちらも加速です。

于 2012-10-15T22:04:09.550 に答える