雪碧运动

问题描述:

我正在把我的头发翻过来。出于某种奇怪的原因,我无法找到/想想如何在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); 
} 
+0

非常感谢! – Lemmons 2011-01-05 07:20:29

我最喜欢的方式做,这是建立使用SDL_AddTimer周期性定时器的回调函数的帖子自定义事件到事件队列每20毫秒。每当事件循环遇到此事件时,更新精灵位置并重新绘制屏幕的该部分(在精灵的位置绘制背景并在新位置绘制精灵)。

这样做的好处在于,即使您在更新屏幕时暂时失败,精灵的内部表示仍会定期流动。如果您正在进行任何碰撞检测,这一点非常重要,因为精灵会突然跳到屏幕的一半,让它穿过应该阻挡它的墙壁。

+0

我仍然会在帧之间的时间差,因为20毫秒是不能保证。 – Lalaland 2011-01-05 04:17:56