You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scratch中如何实现Sprite2同精灵的两个克隆体接触后同时删除?

Scratch同精灵克隆体两两碰撞仅删除接触对的实现方案

原有方案失效原因

  • Scratch没有内置「触碰同精灵其他克隆体」的专属积木,默认的touching [Sprite2 v]检测会将克隆体自身纳入判定范围,直接使用会出现克隆体判定碰到自己的误判。
  • 同色碰撞检测卡顿死循环,是因为没有加碰撞处理互斥锁,所有克隆体同时触发判定、同时执行删除逻辑,导致帧循环阻塞。
  • 直接将外部写好的touching [Sprite2 v]逻辑移入Sprite2内部不生效,核心是没有排除「检测到自身」的情况,触发条件永远成立或永远不成立。

可直接复用的实现逻辑

核心逻辑为:给每个克隆体分配唯一ID,加碰撞处理互斥锁,碰撞时先标记两个接触的克隆体再执行删除,避免误判和阻塞。

第一步:初始化全局变量(Sprite2本体绿旗逻辑)

新建3个全局变量(所有精灵均可访问):

  • 全局克隆ID计数器:初始值设为0,用于给每个新克隆体分配唯一ID
  • 正在处理碰撞:初始值设为false,作为互斥锁避免多克隆体同时触发碰撞逻辑
  • 临时接触ID:用于碰撞时传递对方克隆体的ID
    绿旗触发时本体执行:
  1. 隐藏本体
  2. 把上述3个全局变量重置为初始值
  3. 执行你原有的克隆体生成逻辑(比如定时克隆自己、按操作克隆等原有逻辑不需要改动)

第二步:克隆体启动逻辑

在Sprite2下新建2个私有变量(仅当前克隆体独立持有,勾选「仅适用于当前克隆体」选项):我的ID、已标记删除
当作为克隆体启动时执行:

  1. 将我的ID设为全局克隆ID计数器的当前值,再将全局克隆ID计数器加1,保证每个克隆体ID唯一不重复
  2. 将已标记删除设为false
  3. 显示克隆体,放入你原有的克隆体移动、交互等业务逻辑,在帧循环末尾加入碰撞检测块,参考逻辑如下:
重复执行
  // 此处保留你原有的克隆体移动、交互逻辑,不需要改动
  【原有逻辑块】
  // 以下为新增碰撞检测逻辑
  如果 <<(已标记删除) = [false]> 且 <(正在处理碰撞) = [false]>> 那么
    如果 <碰到 [Sprite2 v] ?> 那么
      将 [正在处理碰撞 v] 设为 [true]
      // 微调1步位置避免检测到自身的变量值
      面向 [Sprite2 v] 方向 移动 (1) 步
      将 [临时接触ID v] 设为 (Sprite2的我的ID)
      移动 (-1) 步 // 回到原位置不影响原有显示效果
      如果 <(临时接触ID) ≠ (我的ID)> 那么
        将 [已标记删除 v] 设为 [true]
        广播 [通知配对克隆体删除 v] 并等待
        删除此克隆体
      结束如果
      将 [正在处理碰撞 v] 设为 [false]
    结束如果
  结束如果

第三步:碰撞配对删除的广播响应

在Sprite2下新增广播响应逻辑:

当接收到 [通知配对克隆体删除 v]
如果 <<(我的ID) = (临时接触ID)> 且 <(已标记删除) = [false]>> 那么
  将 [已标记删除 v] 设为 [true]
  删除此克隆体
结束如果

避坑提示

  • 私有变量必须勾选「仅适用于当前克隆体」,如果设为全局变量会出现所有克隆体共享变量值的问题,导致ID判定完全混乱
  • 碰撞检测前必须判断正在处理碰撞的锁状态,同一时间只允许一个克隆体处理碰撞逻辑,从根源避免多克隆体同时触发判定导致的卡顿、死循环
  • 必须做ID校验排除自身,否则touching检测会持续命中克隆体自己,出现刚生成就被删除的异常

内容的提问来源于stack exchange,提问作者4.12.22.4.18.0.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:51:24