一种通用的解决方案是根据动画开始后的时间长度将精灵的幻影程度设为“函数”。这将像这样工作:
![按下空格键时,将(动画开始)设置为计时器。 重复直到(定时器 - 动画开始)> 4:将颜色效果设置为(200 / 4)*(定时器 - 动画开始)。](https://i.stack.imgur.com/0kjif.png)
这个动画在四秒内使精灵在颜色效果轮周围一直变化。如果我们一步一步地回顾它,那将是最清楚的。
我们希望我们的动画持续四秒钟。但是我们如何才能让它持续那么久呢?正如您在脚本中看到的那样,仅使用“重复(40):等待 0.1 秒”并不总是导致恰好等待四秒。相反,我们使用“重复直到”循环:“重复直到(计时器 - 动画开始)> 4”。
我们只需在开始动画时将其设置为当前计时器值即可获得“动画开始”变量。稍后我们将再次看到“计时器 - 动画开始”;它真正的意思是动画的进度:“计时器 - 动画开始”从零开始,随着动画的运行逐渐增加到四。(当然,当它达到 4 时,我们想要停止动画,这就是我们使用“repeat until”块的原因。)
这是一个大问题:在给定动画的当前时间量的情况下,我们如何决定颜色效果应该是什么?事实证明,这并不难回答,但我们确实需要仔细考虑,因为它需要数学。我们希望在 4 秒内从 0 过渡到 200。您可以将其写为速率:每 4 秒 200 个单位,因此,200 / 4。然后我们只需将该速率乘以动画的距离:(200 / 4 * 进度)。再次,进步很容易获得;我们只是重用“计时器 - 动画开始”块。
你相信我是对的吗?这是一个包含一些数字的列表来说服你(但实际上,你应该自己尝试这个脚本!):
- 0s: (timer - animation start) = 0, color effect = (200/4) * 0 = 0。这是动画的起点,所以颜色效果为零是有意义的。
- 1s:(定时器-动画开始)=1,色彩效果=(200/4)*1=50。
- 2s: (timer - animation start) = 1, color effect = (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)*(定时器 - 动画开始)。](https://i.stack.imgur.com/E5AeI.png)
但在这一点上,您可能会发现“陷阱”——看看如果添加人工延迟会发生什么:
![猫变成了幽灵……但并没有完全消失!](https://i.stack.imgur.com/nDAeV.gif)
猫变成了幽灵……但并没有完全消失!哎呀!那么,是什么原因造成的呢?
问题出在:动画在(计时器 - 动画开始)正好 2 秒之前停止。所以,我们从不运行那个 2 秒的步骤,其中幻影效果为 100 - 我们留下了一个没有完全幻影的精灵。
幸运的是,解决方案很简单。只需确保在动画结束后另外切换到最终状态。当然,这只是意味着在“重复直到”循环之后附加适当的“设置效果”块:
![按下 G 键时,将(动画开始)设置为定时器。 重复直到(定时器 - 动画开始)> 2:将幻影效果设置为(100 / 2)*(定时器 - 动画开始)。 循环结束后,将幽灵效果设置为 100。](https://i.stack.imgur.com/0JFBT.png)
现在精灵的幻影效果将在循环后立即设置为 100,无论它以什么结尾。
顺便说一句,当您为自己测试这些脚本时 - 您做了,不是吗?- 你注意到这个动画非常流畅吗?事实上,它的动画尽可能流畅。它将始终以用户计算机可以处理的最高帧速率进行动画处理,因为它运行每个 Scratch 帧(没有“等待 n 秒”块)!另外,对您的理解进行简单测试-您如何使用它重新实现“滑行(n)秒到(x)(y)”块?这绝对是可能的!