【问题标题】:scratch timer method not accurate从头计时方法不准确
【发布时间】:2018-01-18 14:15:06
【问题描述】:

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

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。如果有任何方法可以使计时器更准确或改进我的代码以减少延迟,我们将不胜感激。

【问题讨论】:

    标签: time timer wait mit-scratch


    【解决方案1】:

    一个通用的解决方案是根据动画开始的时间长度将精灵的幻影程度设为“函数”。这将像这样工作:

    这个动画在四秒内使精灵在颜色效果轮周围一直变化。如果我们逐步了解它,就会很清楚如何。

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

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

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

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

    • 0s: (timer - 动画开始) = 0, color effect = (200/4) * 0 = 0。这是动画的起点,所以颜色效果是有意义的零。
    • 1s:(计时器 - 动画开始)= 1,颜色效果 = (200/4) * 1 = 50。
    • 2s: (timer - 动画开始) = 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 的脚本:

    但在这里你可能会发现一个“陷阱”——看看如果你添加人为延迟会发生什么:

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

    问题是:动画停止之前(计时器 - 动画开始)正好是 2 秒。因此,我们从不运行 2 秒的步骤,其中重影效果为 100 - 我们得到的精灵不是完全重影。

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

    现在精灵的幻影效果将在循环后立即设置为 100,不管它以什么结尾。


    顺便说一句,当您自己测试这些脚本时 - 您做过,不是吗? - 你注意到这个动画非常流畅吗?事实上,它尽可能流畅地制作动画。它将始终以用户计算机可以处理的最高帧速率进行动画处理,因为它运行每个 Scratch 帧(没有“等待 n 秒”块)!另外,对您的理解进行简单测试-您如何使用它重新实现“滑行(n)秒到(x)(y)”块?绝对有可能!

    【讨论】:

    • 不错!我开始想知道 snap/byob 中的动画计时器控件如何演示一流的功能。
    • 哇!你知道这里有很多人只是试图回答这个问题并解决它,但你实际上详细介绍了它的工作原理以及每种方法的作用,我非常感谢!到目前为止,我得到的关于堆栈溢出的最佳答案!我一定会在我的项目中实现这一点,很抱歉我偶尔会处理这个问题,所以我没有太多时间来处理它
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2017-03-29
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多