11

我需要构建用于Scratch或稍后在 snap 中使用的编程块的迷你版本!或开放块。

它们中的代码都很大而且很难理解,尤其是在 Scratch 中,它是用 SmallTalk 的某种子集编写的,我不知道。

我在哪里可以找到他们都用来解析块并将其转换为一组指令的算法,这些指令适用于某些东西,例如 Scratch 中的动画或游戏?

我对编程块概念背后的算法或架构非常感兴趣。

4

1 回答 1

23

这只是一个非常笼统的解释,具体细节由您决定。

定义块

有一个Block所有块都继承自的类。它们使用它们的标签(名称)、形状和对该方法的引用进行初始化。当它们被运行/调用时,关联的方法被传递当前上下文(sprite)和参数。

不同版本的具体实现不同。例如,在 Scratch 1.x 中,方法的参数对应于块的参数,上下文(thisself)是精灵。在 2.0 中,它们被传递一个包含所有块的参数和上下文的参数。折断!似乎遵循 1.x 方法。

堆栈(命令)块不返回任何内容;记者块做。

口译

解释器的工作方式有点像这样。每个块都包含对下一个块的引用,以及任何子例程(参数中的报告器块;C 槽中的命令块)。

首先,所有论点都已解决。调用记者,并存储他们的返回值。这是针对彼此内部的许多 Reporter 块递归完成的。

然后,命令本身被执行。理想情况下,这是一个简单的命令(例如移动)。方法被调用,Stage 被更新。

继续下一个块。

C 块

C 块的程序略有不同。这些是if <>风格,也是repeat <>那些。除了它们的普通参数之外,它们还引用了它们的“miniscript”子例程。

对于一个简单的if/elseC 程序块,如果适用,只需正常执行子程序即可。

但是,在处理循环时,您必须确保线程正确,并等待其他脚本。

活动

按键/点击事件可以很容易地处理。只需在按键/单击时执行它们。

当广播堆栈运行时,可以通过执行帽子来完成广播之类的事情。

其他事件你必须自己解决。

等待块

这与线程一起对我来说是解释中最令人困惑的部分。基本上,您需要弄清楚何时继续执行脚本。也许设置一个计时器在时间之后执行,但你仍然需要正确地线程。

我希望这有帮助!

于 2014-08-10T08:09:45.707 回答