刮擦计时器方法不准确

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

Flo*_*rie 7

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

按空格键时,将(动画开始)设置为计时器. 重复直到(计时器 - 动画开始)> 4:将颜色效果设置为(200/4)*(计时器 - 动画启动).

此动画可以激活精灵在四秒钟内围绕颜色效果轮一直变化的动画.这将是最清楚怎样的作品,如果我们去在它一步一步来.

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

我们通过在开始动画时将其设置为当前计时器值来获得"动画开始"变量.稍后我们会再次看到"计时器 - 动画开始"; 它的真正意义在于动画的进展:"定时器 - 动画开始"从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的脚本:

按下G键时,将动画开始设置为计时器. 重复直到(计时器 - 动画开始)> 2:将重影效果设置为(100/2)*(计时器 - 动画开始).

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

猫变成了幽灵......但是没有完全消失!

猫变成了幽灵......但是没有完全消失!哎呀!那是什么造成的呢?

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

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

按下G键时,将(动画开始)设定为计时器. 重复直到(计时器 - 动画开始)> 2:将重影效果设置为(100/2)*(计时器 - 动画开始). 循环后,将重影效果设置为100.

现在精灵的鬼影效果将在循环后立即设置为100,无论它结束的是什么.


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