【问题标题】:Sprite movement精灵运动
【发布时间】:2011-01-05 01:41:28
【问题描述】:

我正在为这个扯掉我的头发。出于某种奇怪的原因,我无法找到/想到如何在 SFML 和/或 SDL 中移动精灵。我为这两个库查看的教程对此一无所知。所以我认为它更像是一个 C++ 的东西而不是一个库的东西。

所以我想知道;如何移动精灵?

(当我说移动时,我的意思是让精灵以设定的速度“滑过”窗口)

【问题讨论】:

    标签: c++ sdl sfml


    【解决方案1】:

    您需要一个每秒被调用固定次数的循环,然后在每帧更新精灵的 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);
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我仍然会计算帧之间的差异,因为 20 毫秒是绝对不能保证的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多