这取决于您假设的“睡眠”是如何实现的。您应该知道一些事情,因为它可以通过几种方式解决。
你不想让你的线程进入睡眠状态,因为那样一切都会停止,这不是你想要的。
另外,您可能会获得比睡眠所允许的更多的时间。例如,如果你睡了 700 毫秒,你可能会得到更多,这意味着如果你依赖准确的时间,你可能会因此而被烧毁。
1) 第一种方法是记录播放器内部的原始时间。这不是最好的方法,但它适用于一个简单的玩具程序,并在你开火时在课堂上记录std::chrono::high_resolution_clock::now() 的结果(检查#include <chrono> 或查看here)。要检查您是否可以再次触发,只需将您存储的值与...::now() 进行比较,看看是否已经过了 700 毫秒。您必须阅读文档才能在几毫秒内使用它。
2) 更好的方法是通过称为“游戏滴答”的东西为您的游戏提供一个脉冲,这是您的世界前进的脉冲。然后你可以存储你开火的gametick并做一些类似于上面段落的事情(除了现在你只是检查currentGametick > lastFiredGametick + gametickUntilFiring)。
对于 gametick 的想法,你会确保你每 X 毫秒执行一次gametick++,然后运行你的世界。一个常见的值介于 10 毫秒和 50 毫秒之间。
你的游戏循环看起来像
while (!exit) {
readInput();
if (ticker.shouldTick()) {
ticker.tick();
world.tick(ticker.gametick);
}
render();
}
以上有以下优点:
现在这避免了大量的讨论,如果你想走游戏路线,你绝对应该阅读this。
无论你走哪条路,你可能都需要阅读this。