雪碧运动

时间:2011-01-05 01:41:28

标签: c++ sdl sfml

我正在把这头发撕掉。由于一些奇怪的原因,我无法找到/想到如何在SFML和/或SDL中移动精灵。我看过两个库的教程都没有说明这一点;所以我认为它更像是一个C ++而不是一个库的东西。

所以我在想;你怎么移动精灵?

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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