我正在把这头发撕掉。由于一些奇怪的原因,我无法找到/想到如何在SFML和/或SDL中移动精灵。我看过两个库的教程都没有说明这一点;所以我认为它更像是一个C ++而不是一个库的东西。
所以我在想;你怎么移动精灵?
(当我说移动时,我的意思是让精灵以一定的速度在窗口“滑行”)
答案 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毫秒将一个自定义事件发布到事件队列中。每当事件循环遇到此事件时,更新精灵位置并重新绘制屏幕的该部分(在精灵所在的位置绘制背景并在其新位置绘制精灵)。
这样做的好处是,即使你暂时落后于更新屏幕,精灵的内部表示仍将定期流动。如果您正在进行任何碰撞检测,这很重要,其中精灵突然跳过屏幕的一半,可以让它通过一堵应该阻挡它的墙。