QTimer setInterval without resetting remainingTime



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

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

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

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

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

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

在这方面,最好不要使用连续运行的计时器,而是手动安排每个下一个游戏周期,并且只在需要时才这样做。例如,如果游戏即将结束,你可能不需要安排另一个。此外,这将允许更好地控制游戏速度的准确性,在游戏周期执行完成后,你可以计算距离需要下一个周期还有多少时间,并根据该值安排它,或者如果执行时间太长,你可以立即安排它。

最新更新