【问题标题】:SFML - Frame independent movement + dragging windowSFML - 框架独立移动+拖动窗口
【发布时间】:2013-06-06 13:49:43
【问题描述】:

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

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

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

【问题讨论】:

  • 如果你能上传一个演示问题的应用程序,我会尽力帮助你;)

标签: windows frame drag sfml


【解决方案1】:

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

您可以尝试查看 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 的增量。

【讨论】:

  • 感谢您的提示,我已经测试了 LostFocus,但它没有通知。我会尝试调整大小,但如果它有效,我会感到惊讶。您的解决方案在某种程度上有效,但如果用户只拖动少量窗口,那么仍然会有延迟。如果我找不到更好的解决方案,那么我会选择这个。不过感谢您的回复。
  • 是的,我刚刚测试过... sf::Event::Resized 不会在窗口被拖动时触发。
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 2011-07-26
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2014-08-12
相关资源
最近更新 更多