在 Scratch 中,我有一个变量,每次收到广播时该变量应该改变 1,但是,在测试中,每次广播它都会改变 3,我找不到原因。用于发送广播的按钮有 3 个克隆,但每个克隆都有不同的功能,发送广播取决于“按钮选择”变量设置为“战斗”,因此不要认为这会影响结果。
我查看了所有代码,它没有重复,没有其他任何内容更改变量,并且广播一次仅发送一次。如果我自己单击块来运行它们,它甚至可以完美地工作,但是当它作为游戏中的函数执行它时,它会将其更改为三,我不明白为什么。
更改变量的代码是:
When I receive "attack"
Change "attacktimes" by 1
发送广播的代码是这样的:
When key "z" pressed
if "enemy turn" = "0"
if "button type" = "fight"
broadcast "fight"
有人知道解决办法吗?
这也是共享项目,但它不完整。
我的项目
说明中列出了重现错误的步骤
广播是一种强大的机制,但它们可能很难控制, 特别是在使用克隆的项目中。
我查看了所有代码,它没有重复
这无关紧要。这一切都在名称中:广播无处不在。 在查看(静态)代码时,看似单个操作可能会在运行时向各个方向爆炸。
一般来说,在克隆具有“当我收到”消息处理程序的精灵时要“非常小心”。 每个克隆以及原始精灵都会触发消息处理程序。 在你的例子中,精灵“Error404 Sans”有两个克隆。加上原始精灵,总共三个对象。 当消息“攻击”到来时,将为三个对象中的每一个执行“当我收到攻击时”脚本。 由于变量“AttackTimes”是全局变量,因此它将增加三倍。
那么如何解决这个问题呢?在这种情况下,最简单的方法是将整个“当我收到攻击时”脚本移动到舞台、虚拟精灵或任何其他未克隆的精灵
。 Sans 精灵由三部分组成,这很可爱,让他看起来有“呼吸”的感觉。 但这对于精灵来说已经是一个很大的责任了;更好地在其他地方实施“攻击”部分。 否则,你会发现自己被 Sans 的头部、躯干和腿部独立攻击。一种更笨拙的解决方案是使用“if-then”块来确保只有一个特定的克隆会继续攻击。 对于“if”条件,您将需要一个“仅用于此精灵”变量或任何其他特定于克隆的变量(例如位置、服装名称)。