私は 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) になります。.move
sf::Sprite playerSprite
.move
player.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);