我需要构建用于Scratch或稍后在 snap 中使用的编程块的迷你版本!或开放块。
它们中的代码都很大而且很难理解,尤其是在 Scratch 中,它是用 SmallTalk 的某种子集编写的,我不知道。
我在哪里可以找到他们都用来解析块并将其转换为一组指令的算法,这些指令适用于某些东西,例如 Scratch 中的动画或游戏?
我对编程块概念背后的算法或架构非常感兴趣。
我需要构建用于Scratch或稍后在 snap 中使用的编程块的迷你版本!或开放块。
它们中的代码都很大而且很难理解,尤其是在 Scratch 中,它是用 SmallTalk 的某种子集编写的,我不知道。
我在哪里可以找到他们都用来解析块并将其转换为一组指令的算法,这些指令适用于某些东西,例如 Scratch 中的动画或游戏?
我对编程块概念背后的算法或架构非常感兴趣。
这只是一个非常笼统的解释,具体细节由您决定。
有一个Block
所有块都继承自的类。它们使用它们的标签(名称)、形状和对该方法的引用进行初始化。当它们被运行/调用时,关联的方法被传递当前上下文(sprite)和参数。
不同版本的具体实现不同。例如,在 Scratch 1.x 中,方法的参数对应于块的参数,上下文(this
或self
)是精灵。在 2.0 中,它们被传递一个包含所有块的参数和上下文的参数。折断!似乎遵循 1.x 方法。
堆栈(命令)块不返回任何内容;记者块做。
解释器的工作方式有点像这样。每个块都包含对下一个块的引用,以及任何子例程(参数中的报告器块;C 槽中的命令块)。
首先,所有论点都已解决。调用记者,并存储他们的返回值。这是针对彼此内部的许多 Reporter 块递归完成的。
然后,命令本身被执行。理想情况下,这是一个简单的命令(例如移动)。方法被调用,Stage 被更新。
继续下一个块。
C 块的程序略有不同。这些是if <>
风格,也是repeat <>
那些。除了它们的普通参数之外,它们还引用了它们的“miniscript”子例程。
对于一个简单的if/else
C 程序块,如果适用,只需正常执行子程序即可。
但是,在处理循环时,您必须确保线程正确,并等待其他脚本。
按键/点击事件可以很容易地处理。只需在按键/单击时执行它们。
当广播堆栈运行时,可以通过执行帽子来完成广播之类的事情。
其他事件你必须自己解决。
这与线程一起对我来说是解释中最令人困惑的部分。基本上,您需要弄清楚何时继续执行脚本。也许设置一个计时器在时间之后执行,但你仍然需要正确地线程。
我希望这有帮助!