QTimer setInterval不重置remainingTime

时间:2015-10-03 00:54:27

标签: c++ qt qtimer

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

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

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

1 个答案:

答案 0 :(得分:3)

您可以完全省略计时器对象,而是使用静态方法QTimer::singleShot(...),并使用timerValue在每个计时器事件上设置新的单个镜头。因此,无论修改timerValue的频率如何,每个计时器周期都将使用旧值完成,并使用当前值进行调度。

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

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

就此而言,最好不要使用连续运行的计时器,而是手动安排每个下一个游戏周期,并且只在需要时。例如,如果游戏结束,您可能不需要安排另一个。此外,这将允许更好地控制游戏速度的精确程度,在游戏周期执行完成后,您可以计算需要多长时间,直到需要下一个,并使用该值安排,或者如果执行采取太久了,你可以立即安排。