0

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

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

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

4

2 回答 2

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);
}
于 2011-01-05T01:48:01.000 回答
0

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

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

于 2011-01-05T02:44:52.933 回答