变量增加 3 而不是 1

Variable increasing by 3 instead of 1

在 Scratch 中,我有一个变量应该在每次接收到广播时改变 1,但是在测试时它会在每次广播时改变 3,但我找不到原因。用于发送广播的按钮有 3 个克隆,但每个都有不同的功能,发送广播取决于“按钮选择”变量设置为“战斗”,所以不要认为这会影响结果。

我查看了我所有的代码,没有重复,没有其他改变变量的东西,广播一次只发送一次。如果我自己点击方块 运行 ,它甚至工作得很好,但是当它作为游戏中的功能执行时,它会改变三个,我不明白为什么。

改变变量的代码是:

When I recieve "attack"
Change "attacktimes" by 1

发送广播的代码是这样的:

When key "z" pressed
if "enemy turn" = "0"
if "button type" = "fight"
broadcast "fight"

有人知道解决方案吗?
这里还有共享项目,但它不完整。 My project
说明中列出了重新创建错误的步骤

广播是一种强大的机制,但很难控制, 特别是在使用克隆的项目中。

I looked through all my code and it's not duplicated

那是无关紧要的。一切尽在其中:广播无处不在。 在查看(静态)代码时,看似单一的操作可能会在运行时向各个方向爆炸。

一般来说,在克隆具有 'when I receive' 消息处理程序的 sprite 时,要非常小心。 将为每个克隆以及原始精灵触发消息处理程序。

在您的例子中,精灵 'Error404 Sans' 有两个克隆。连同原始精灵,总共是三个对象。 当消息 'Attack' 进来时,将为三个对象中的每一个执行 'when I receive Attack' 脚本。 由于变量'AttackTimes'是一个全局变量,所以会自增3倍。

那么如何解决这个问题呢?在这种情况下,最简单的方法是将整个 'when I receive Attack' 脚本移动到舞台上,移动到虚拟精灵或任何其他未克隆的精灵 。 拥有一个由三部分组成的 Sans 精灵很可爱,让他看起来 'breathing'。 但这对精灵来说已经是一个很大的责任了;更好地在其他地方实施 'attacking' 部分。 否则,你会发现自己被 Sans 的头、躯干和腿单独攻击。

一种更笨拙的解决方案是使用 'if-then' 块来确保只有一个特定的克隆会继续进行攻击。 对于 'if' 条件,您将需要一个 'for this sprite only' 变量或任何其他 clone-specific(例如位置、服装名称)。