私はこれの上に私の髪を引き裂いています。奇妙な理由で、SFMLやSDLでスプライトを移動する方法を見つけられない/考えられません。私が両方のライブラリについて調べたチュートリアルは、これについて何も述べていません。ですから、ライブラリよりもC++の方が多いと思います。
だから私は疑問に思っていました。スプライトをどのように動かしますか?
(私が移動と言うとき、私はスプライトが設定された速度でウィンドウを横切って「滑る」ことを意味します)
毎秒固定回数呼び出されるループが必要です。その後、各フレームでスプライトの x、y 値を更新します。
SFML の場合、sprite.move があります
while (App.IsOpened())
{
// Process events
sf::Event Event;
while (App.GetEvent(Event))
{
if (Event.Type == sf::Event::Closed)
App.Close();
}
// Get elapsed time
float ElapsedTime = App.GetFrameTime();
// Move the sprite
if (App.GetInput().IsKeyDown(sf::Key::Left)) Sprite.Move(-100 * ElapsedTime, 0);
if (App.GetInput().IsKeyDown(sf::Key::Right)) Sprite.Move( 100 * ElapsedTime, 0);
if (App.GetInput().IsKeyDown(sf::Key::Up)) Sprite.Move(0, -100 * ElapsedTime);
if (App.GetInput().IsKeyDown(sf::Key::Down)) Sprite.Move(0, 100 * ElapsedTime);
}
これを行うための私のお気に入りの方法は、20 ミリ秒ごとにイベント キューにカスタム イベントを投稿するコールバック関数を SDL_AddTimer を使用して繰り返しタイマーを設定することです。イベント ループがこのイベントに遭遇するたびに、スプライトの位置を更新し、画面のそのセクションを再描画します (スプライトがあった場所に背景を描画し、新しい場所にスプライトを描画します)。
このようにすることの良い点は、画面の更新が一時的に遅れた場合でも、スプライトの内部表現が定期的に流れることです。これは、衝突検出を行う場合に重要です。スプライトが画面の途中で突然ジャンプすると、スプライトをブロックするはずだった壁を通過してしまう可能性があります。