刮擦计时器方法不准确

时间:2018-01-18 14:15:07

标签: time timer wait mit-scratch

所以我制作的游戏在很大程度上取决于时间和人的反应速度,我注意到一个随机时间有点错误的小游戏。例如:我有方法

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次。如果有任何方法可以使计时器更准确或改进我的代码以减少滞后,那将非常感激。

1 个答案:

答案 0 :(得分:7)

一个通用的解决方案是让精灵如何成为一个"函数"根据动画开始的时间长短。这将是这样的:

When space key pressed, set (animation start) to timer. Repeat until (timer - animation start) > 4: set color effect to (200 / 4) * (timer - animation start).

这个动画可以激活精灵在四秒钟内一直改变颜色效果轮的效果。如果我们一步一步地完成它,它将是最清晰的如何

我们希望我们的动画持续四秒钟。但是,我们实际如何让它持续那么久?正如您的脚本中所见,只需使用" repeat(40):等待0.1秒"并不总是导致等待四秒钟。相反,我们使用"重复直到"循环:"重复直到(计时器 - 动画开始)> 4"

我们得到了#34;动画开始"变量只是在我们开始动画时将其设置为当前计时器值。我们将看到"计时器 - 动画开始"再来一次;它的真正含义是通过动画实现进展:"计时器 - 动画开始"从0开始,随着动画的运行逐渐增加到4。 (当然,当它达到4时,我们想要停止动画,这就是为什么我们使用"重复直到"阻止。)

这是一个很大的问题:如果考虑到动画当前的时间量,我们可以决定颜色效果应该是什么?事实证明,那就是不是很难回答,但我们确实需要仔细思考,因为它需要数学。我们希望在4秒的时间内从0过渡到200。您可以将其写为速率:每4秒200个单位,因此,200 / 4.然后我们将该速率乘以动画的距离:(200/4 *进度)。很容易再次取得进展;我们只是重复使用"计时器 - 动画开始"块。

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

  • 0s:(计时器 - 动画开始)= 0,色彩效果=(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。

为了自己尝试,我建议实施一些"人工滞后"。这只是意味着添加一个"等待(随机0.1 - 0.3)秒"阻止模拟可能出现在非常复杂的项目或慢速计算机上的延迟。

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

When G key pressed, set animation start to timer. Repeat until (timer - animation start) > 2: set ghost effect to (100 / 2) * (timer - animation start).

但是在这里你可能会发现一个"陷阱" - 看看如果添加人工滞后会发生什么:

The cat turns ghost-y.. but doesn't ENTIRELY disappear!

猫变鬼了..但是没有完全消失!哎呀!那么,是什么导致了这个?

问题在于:动画在(计时器 - 动画启动)正好是2秒之前停止。所以,我们从来没有运行那个2s步骤,其中鬼效应为100 - 而且我们留下了一个不完全幻影的精灵。

幸运的是,解决方案很简单。只需确保在动画结束后再切换到最终状态。当然,这只意味着附加适当的"设置效果"在"之后阻止,直到"循环:

When G key pressed, set (animation start) to timer. Repeat until (timer - animation start) > 2: set ghost effect to (100 / 2) * (timer - animation start). After the loop, set ghost effect to 100.

现在精灵的鬼影效果将在循环后立即设置为100,无论结尾如何。

顺便说一下,当你为自己测试这些脚本时 - 你做了,不是吗? - 你注意到这个动画很顺利吗?实际上,它尽可能平滑地动画 。它将始终以用户计算机可以处理的顶部帧速率进行动画处理,因为它运行每个Scratch帧(没有"等待n秒"块)!另外,对你的理解进行一个简单的测试 - 你如何重新实现"滑行(n)秒到(x)(y)"阻止使用这个?这绝对是可能的!