【问题标题】:What is the architecture behind Scratch programming blocks?Scratch 编程块背后的架构是什么?
【发布时间】:2014-01-20 21:10:39
【问题描述】:

我需要构建在Scratch 或更高版本中使用的编程块的迷你版本!或 openblocks。

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

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

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

【问题讨论】:

  • 在某种程度上你已经回答了你的问题 - 块被解析,然后重写为语言解释的指令。只有解析是预先完成的,因为当拖动块时,系统会在代码中记录一个标记 - 换句话说,块只在语法有效的语句中组合的原因是解析是在编辑时完成的。

标签: mit-scratch block-programming


【解决方案1】:

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

定义块

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

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

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

口译

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

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

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

继续下一个块。

C 块

C 块的过程略有不同。这些是if <> 样式和repeat <> 样式。除了它们的普通参数之外,它们还引用了它们的“miniscript”子例程。

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

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

活动

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

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

您必须自己解决的其他事件。

等待块

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

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多