刮擦计时器方法不准确

scratch timer method not accurate

所以我正在制作一款很大程度上取决于时间和玩家反应速度的游戏,我注意到一个小错误,它有一个 运行domized 时间。例如:我有方法

wait pick random .01 to 3 seconds set ghost effect to 0 reset timer repeat 5 wait .05 seconds change ghost effect by 20

每次我 运行 这个,我得到不同的时间。这不可能是我 运行 减少等待时间的事实,因为 reset timer 方法在该块之后。我 运行 进行了一些测试,我得出结论,12 次中有 7 次我得到了 0.8 秒,这正是我想要得到的。 12 次中有 3 次我得到 0.7,12 次中有 2 次我得到 0.6。如果有任何方法可以使计时器更准确或改进我的代码以减少延迟,将不胜感激。

一个通用的解决方案是根据动画开始后的时间来设置精灵的重影程度 "function"。这会像这样工作:

此动画使精灵在四秒内围绕颜色效果轮一直变化。 如果我们一步一步来,它是如何工作的将是最清楚的。

我们希望我们的动画持续四秒钟。但是我们如何实际上让它持续那么久呢?正如在您的脚本中看到的那样,仅使用 "repeat (40): wait 0.1 seconds" 并不总是导致恰好等待四秒钟。相反,我们使用 "repeat until" 循环:"repeat until (timer - animation start) > 4".

我们只需在启动动画时将其设置为当前计时器值即可获得 "animation start" 变量。稍后我们将再次看到 "timer - animation start";它真正的意思是 progress 通过动画:"timer - animation start" 从零开始,随着动画 运行 逐渐增加到 4。 (当然,当它达到 4 时,我们想停止动画,这就是我们使用 "repeat until" 块的原因。)

这是个大问题:如何在给定当前动画播放时间的情况下,决定颜色效果应该是什么?事实证明,这并不难回答,但我们确实需要仔细考虑,因为它需要数学。我们希望在 4 秒内从 0 过渡到 200。您可以将其记为一个速率:每 4 秒 200 个单位,因此,200 / 4。然后我们只需将该速率乘以动画的进度:(200 / 4 * 进度)。再次,进步很容易获得;我们只是重复使用 "timer - animation start" 块。

你相信我是对的吗?这里有一个列表,其中包含一些可以说服您的数字(但实际上,您应该自己尝试一下这个脚本!):

  • 0s:(timer-动画开始)=0,color effect=(200/4)*0=0。这里是动画的起点,所以颜色效果为零是有意义的。
  • 1s:(定时器-动画开始)=1,色彩效果=(200/4)*1=50.
  • 2s:(定时器-动画开始)=1,色彩效果=(200/4)*2=100。4秒长动画播放到一半:自我们正在从 0 过渡到 200,现在为 100 是有意义的。
  • 3.5s:(定时器-动画开始)=3.5,色彩效果=(200/4)*3.5=175.
  • 4s:(定时器-动画开始)=4,色彩效果=(200/4)*4=200。既然到了最后,我们'已经一路过渡到 200。

要亲自尝试,我建议实施一些 "artificial lag"。这只是意味着添加一个 "wait (random 0.1 - 0.3) seconds" 块来模拟可能出现在非常复杂的项目或缓慢的计算机上的延迟。

由于我们只是处理一个基本的数学公式,因此很容易更改数字以获得不同的结果。这是一个在 2 秒内从 0 过渡到 100 的脚本:

但这里有一点您可能会发现 "gotcha" -- 看看如果您添加人为滞后会发生什么:

这只猫变成了幽灵..但并没有完全消失!哎呀!那么,是什么原因造成的?

问题出在这里:动画停止 before(计时器 - 动画开始)刚好是 2 秒。所以,我们从来没有 运行 那 2 秒的步骤,其中重影效果为 100 - 我们留下了一个没有完全重影的精灵。

幸运的是,解决方案很简单。只需确保在动画结束后 切换到最终状态 即可。当然,这只是意味着在 "repeat until" 循环之后附加适当的 "set effect" 块:

现在精灵的幽灵效果将在循环后立即设置为 100,无论它以什么结尾。


顺便说一下,当您自己测试这些脚本时 - 您 做过 ,不是吗? - 你有没有注意到这个动画非常流畅?事实上,它 尽可能流畅地设置动画 。它将始终以用户计算机可以处理的最高帧速率进行动画处理,因为它 运行 是每个 Scratch 帧(没有 "wait n seconds" 块)!另外,一个简单的测试你的理解 - 你怎么能用这个重新实现 "glide (n) seconds to (x) (y)" 块?绝对有可能!