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