1

我正在尝试在 SFML 中实现与帧无关的移动,但无法使其正常工作。当我之前在使用 SDL 时遇到这个问题时,我发现 Windows 会在应用程序的主线程移动时暂停它(通过拖动标题栏)。问题来了,因为当窗口被拖动时,时钟会更新,但直到我放开窗口才会绘制运动。当我移动窗口时,窗口不再被绘制,但时间仍在增加。因此,当我放开窗口时,如果没有拖动窗口,单元会立即跳转到它们所在的位置。

我尝试了一个解决方案,由于 Windows 只暂停主线程,我考虑只在一个单独的线程中运行整个游戏,然后在 main() 中启动它,但这似乎不起作用,因为发生了相同的结果。我还考虑过因此得到的极低 FPS,但我无法区分拖动窗口的人和他们的游戏是否自然运行缓慢......必须有一种方法防止windows暂停主线程,或者做一些防止这个问题的事情,但我在互联网上没有找到任何解决方案......

这是演示问题的 zip 文件的链接。Demo0 和 Demo1 都是一样的,只不过 Demo1 使用了第二个线程来运行程序,但是效果是一样的。只需运行两者并观察增量值输出到命令行。然后拖动窗口并将其移动到屏幕的其他部分。当您放手时,您应该会看到一个非常大的 delta 值,并且圆圈应该会向前跳跃,具体取决于您暂停窗口的时间。源代码都在那里(在“src”文件夹中),所以我希望人们能理解确切的问题:http ://www.sendspace.com/file/4er8f4

4

1 回答 1

2

我看到了两个问题的解决方案:

您可以尝试查看 sf::Events LostFocus 或 Resized 是否拾取窗口拖动,如果有,只需暂停游戏时钟。更多信息可以在这里找到:http ://www.sfml-dev.org/tutorials/2.0/window-events.php

但是,如果这不起作用,我会简单地在您的增量上添加一个上限。意思是,如果游戏超过某个 delta 阈值(1/60 或 1/30),您将 delta 设置为较低的值。不过,在您的情况下,这个上限可能非常大,例如 1/15。

if(delta > 1/15.0f)
    delta = 1/15.0f;

无论如何,您可能都不希望您的游戏能够以 15fps 的速度播放,并且如果用户在移动时拖动窗口,您将不得不处理的最糟糕的情况是恢复时出现 15fps 的增量。

于 2013-06-13T16:45:01.807 回答