雪碧运动
问题描述:
我正在把我的头发翻过来。出于某种奇怪的原因,我无法找到/想想如何在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毫秒。每当事件循环遇到此事件时,更新精灵位置并重新绘制屏幕的该部分(在精灵的位置绘制背景并在新位置绘制精灵)。
这样做的好处在于,即使您在更新屏幕时暂时失败,精灵的内部表示仍会定期流动。如果您正在进行任何碰撞检测,这一点非常重要,因为精灵会突然跳到屏幕的一半,让它穿过应该阻挡它的墙壁。
+0
我仍然会在帧之间的时间差,因为20毫秒是不能保证。 – Lalaland 2011-01-05 04:17:56
非常感谢! – Lemmons 2011-01-05 07:20:29