克隆网格

A Grid of Clones

我的目标是构建一个 5x5 的图像网格。在下面的代码中,rowcolrowcol 被创建为精灵的局部变量,而 newcolnewrowcats 是全球的。 (顺便说一句,是否可以区分哪些变量是局部的,哪些是全局的?容易忘记或出错。)

结果仅为 5x1 网格,如此处所示。

我不清楚这些语句的执行顺序。 when I start as a clone 是在 add_cat 第二次被调用之前还是之后被调用?我的初步结论是它是在事后被调用的,但克隆的全局变量似乎包含了它们事前的值。

当我尝试使用 asksay 以及 wait 命令调试它时,结果千差万别。在某些地方添加这样的停顿完全解决了这个问题,产生了 5x5 的网格。在其他地方,他们造成了一个1x5的网格。

主要问题是:如何解决此问题以生成 5x5 网格?

说明

不幸的是,Scratch 中的执行顺序有点奇怪。每当您编辑脚本(通过添加或删除块、编辑输入或将整个脚本拖到编辑器中的新位置)时,它都会被放置在列表的底部(因此它 运行s 最后)。

测试这一点的一个好方法是使用以下脚本创建一个空白项目:

当您单击绿旗时,精灵会说"script one"或"script two",具体取决于哪个运行先说。尝试单击并拖动 when green flag clicked 块之一。下次您单击绿色旗帜时,精灵会说出与您刚刚拖动的脚本对应的消息。

这种疯狂的命令会使执行变得难以预测,尤其是在使用克隆时。

解决方案

唯一真正的解决办法是编写内置有明确执行顺序的代码(而不是依赖于编辑器的突发奇想)。对于更简单的脚本,这通常意味着使用 broadcast and wait 块以必要的顺序 运行 特定事件。

对于您的具体项目,我看到两个主要解决方案:

程序解决方案 这是最直接的脚本,我可能会选择使用它:

rowcol 都是 sprite-only 变量)
因为克隆在创建时会继承所有 sprite-only 变量值,所以每个克隆在创建时都将保证具有正确的行和列。

递归求解 这个解决方案比第一个更难理解,所以我可能会避免使用它,除非你只是在寻找新奇事物: