C++ 精灵运动

C++ 精灵运动,c++,sdl,sfml,C++,Sdl,Sfml,这件事让我毛骨悚然。出于某种奇怪的原因,我无法找到/思考如何在SFML和/或SDL中移动精灵。我看过的两个库的教程都没有说明这一点;所以我认为它比图书馆的东西更像C++。 所以我想知道;你如何移动一个精灵 (当我说移动时,我的意思是让精灵以设定的速度“滑动”穿过窗口)你需要一个每秒调用固定次数的循环,然后你更新精灵每帧的x,y值 对于SFML,您有sprite.move while (App.IsOpened()) { // Process events sf::Event Ev

这件事让我毛骨悚然。出于某种奇怪的原因,我无法找到/思考如何在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);
}

我最喜欢的方法是使用SDL_AddTimer和回调函数设置一个循环计时器,该回调函数每20毫秒向事件队列发布一个自定义事件。每当您的事件循环遇到此事件时,更新精灵位置并重新绘制屏幕的该部分(在精灵所在位置绘制背景并在其新位置绘制精灵)


这样做的好处是,即使您在更新屏幕时暂时落后,精灵的内部表示仍将定期流动。如果要进行任何碰撞检测,这一点很重要,如果精灵突然跳到屏幕的一半,可能会让它穿过本来应该阻挡它的墙。

我仍然会计算帧之间的时间差,因为这20毫秒无法保证。