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