克隆网格
A Grid of Clones
我的目标是构建一个 5x5 的图像网格。在下面的代码中,row
、col
和 rowcol
被创建为精灵的局部变量,而 newcol
、newrow
和 cats
是全球的。 (顺便说一句,是否可以区分哪些变量是局部的,哪些是全局的?容易忘记或出错。)
结果仅为 5x1 网格,如此处所示。
我不清楚这些语句的执行顺序。 when I start as a clone
是在 add_cat
第二次被调用之前还是之后被调用?我的初步结论是它是在事后被调用的,但克隆的全局变量似乎包含了它们事前的值。
当我尝试使用 ask
和 say
以及 wait
命令调试它时,结果千差万别。在某些地方添加这样的停顿完全解决了这个问题,产生了 5x5 的网格。在其他地方,他们造成了一个1x5的网格。
主要问题是:如何解决此问题以生成 5x5 网格?
说明
不幸的是,Scratch 中的执行顺序有点奇怪。每当您编辑脚本(通过添加或删除块、编辑输入或将整个脚本拖到编辑器中的新位置)时,它都会被放置在列表的底部(因此它 运行s 最后)。
测试这一点的一个好方法是使用以下脚本创建一个空白项目:
当您单击绿旗时,精灵会说"script one"或"script two",具体取决于哪个运行先说。尝试单击并拖动 when green flag clicked
块之一。下次您单击绿色旗帜时,精灵会说出与您刚刚拖动的脚本对应的消息。
这种疯狂的命令会使执行变得难以预测,尤其是在使用克隆时。
解决方案
唯一真正的解决办法是编写内置有明确执行顺序的代码(而不是依赖于编辑器的突发奇想)。对于更简单的脚本,这通常意味着使用 broadcast and wait
块以必要的顺序 运行 特定事件。
对于您的具体项目,我看到两个主要解决方案:
程序解决方案
这是最直接的脚本,我可能会选择使用它:
(row
和 col
都是 sprite-only 变量)
因为克隆在创建时会继承所有 sprite-only 变量值,所以每个克隆在创建时都将保证具有正确的行和列。
递归求解
这个解决方案比第一个更难理解,所以我可能会避免使用它,除非你只是在寻找新奇事物:
我的目标是构建一个 5x5 的图像网格。在下面的代码中,row
、col
和 rowcol
被创建为精灵的局部变量,而 newcol
、newrow
和 cats
是全球的。 (顺便说一句,是否可以区分哪些变量是局部的,哪些是全局的?容易忘记或出错。)
结果仅为 5x1 网格,如此处所示。
我不清楚这些语句的执行顺序。 when I start as a clone
是在 add_cat
第二次被调用之前还是之后被调用?我的初步结论是它是在事后被调用的,但克隆的全局变量似乎包含了它们事前的值。
当我尝试使用 ask
和 say
以及 wait
命令调试它时,结果千差万别。在某些地方添加这样的停顿完全解决了这个问题,产生了 5x5 的网格。在其他地方,他们造成了一个1x5的网格。
主要问题是:如何解决此问题以生成 5x5 网格?
说明
不幸的是,Scratch 中的执行顺序有点奇怪。每当您编辑脚本(通过添加或删除块、编辑输入或将整个脚本拖到编辑器中的新位置)时,它都会被放置在列表的底部(因此它 运行s 最后)。
测试这一点的一个好方法是使用以下脚本创建一个空白项目:
当您单击绿旗时,精灵会说"script one"或"script two",具体取决于哪个运行先说。尝试单击并拖动 when green flag clicked
块之一。下次您单击绿色旗帜时,精灵会说出与您刚刚拖动的脚本对应的消息。
这种疯狂的命令会使执行变得难以预测,尤其是在使用克隆时。
解决方案
唯一真正的解决办法是编写内置有明确执行顺序的代码(而不是依赖于编辑器的突发奇想)。对于更简单的脚本,这通常意味着使用 broadcast and wait
块以必要的顺序 运行 特定事件。
对于您的具体项目,我看到两个主要解决方案:
程序解决方案
这是最直接的脚本,我可能会选择使用它:
(row
和 col
都是 sprite-only 变量)
因为克隆在创建时会继承所有 sprite-only 变量值,所以每个克隆在创建时都将保证具有正确的行和列。
递归求解
这个解决方案比第一个更难理解,所以我可能会避免使用它,除非你只是在寻找新奇事物: