7

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

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

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

4

1 回答 1

4

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

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

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

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

于 2015-10-03T07:30:01.667 回答