QTimer setInterval 不重置 remainingTime

QTimer setInterval without resetting remainingTime

我有一个用 QT 编写的应用程序,它使用 QTimer。它基本上是一个游戏,所有的动作都由计时器控制。游戏包括 increase\decrease 游戏速度的能力。提高速度的代码是

    timerValue -= speedUpValue;
    if (timerValue < maxSpeed) {
        timerValue = maxSpeed;
    }
    timer -> setInterval(timerValue); 

speedUpValuemaxSpeed是常量。几乎相同的代码用于降低速度。问题是 setInterval 会重置内部计时器,因此如果您继续快速增加或减少速度游戏最终将不会进行,因为 remainingTime 会不断被重置。有没有办法手动设置 remainingTime 或更改间隔而不重置它?

您可以完全省略计时器对象,而是使用静态方法 QTimer::singleShot(...),并使用 timerValue 在每个计时器事件上设置一个新的单发。所以无论timerValue修改多频繁,每个定时器周期都会以旧值完成,并以当前值调度。

正如 RA 提到的,您可以有效地实现保留计时器对象的相同目的,但是将 setInterval() 移动到计时器事件,与上面基本相同,但保留计时器对象,如果需要出于某种原因。

正如 Craig 在评论中提到的,第一种方法还将确保计时器事件不会累积,以防您的游戏逻辑需要更长的时间。此外,如果您选择异步设计,如果您选择连续 运行 计时器,则下一个游戏循环可能会在旧游戏循环完成之前开始执行。

在这方面,最好不要使用连续 运行 计时器,而是手动安排每个下一个游戏周期,并且仅在需要时才使用。例如,如果游戏结束,您可能不需要安排另一个。此外,这将允许更好地控制游戏速度的准确度,在游戏循环执行完成后,您可以计算到需要下一个循环之前剩余的时间,并使用该值安排它,或者执行是否花费太长了,可以马上安排。