【问题标题】:C++ Run only for a certain timeC++ 只运行一段时间
【发布时间】:2019-01-27 05:08:23
【问题描述】:

我正在用 c++ atm 编写一个小游戏。

我的游戏 While 循环始终处于活动状态,在此循环中, 如果玩家正在射击,我有一个条件。

现在我面临以下问题,

每次射击后,都会有一个延迟,这个延迟会随着时间的推移而变化,而玩家应该移动的延迟。

  • 射击
  • 移动
  • 等待 700 毫秒
  • 再拍

atm 我正在使用 Sleep(700) 问题是我在 700 毫秒内无法移动,我需要一个计时器之类的东西,因此移动命令仅执行 700 毫秒而不是等待 700 毫秒

【问题讨论】:

标签: c++ timer


【解决方案1】:

这取决于您假设的“睡眠”是如何实现的。您应该知道一些事情,因为它可以通过几种方式解决。

你不想让你的线程进入睡眠状态,因为那样一切都会停止,这不是你想要的。

另外,您可能会获得比睡眠所允许的更多的时间。例如,如果你睡了 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();
}

以上有以下优点:

  • 你只在每个游戏时间更新世界

  • 您会在游戏点之间持续渲染,因此您可以拥有流畅的动画,因为您将以非常高的帧速率进行渲染

  • 如果要停止,只需在 while 循环中旋转,直到时间结束

现在这避免了大量的讨论,如果你想走游戏路线,你绝对应该阅读this


无论你走哪条路,你可能都需要阅读this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多