Scratch中如何实现Sprite2同精灵的两个克隆体接触后同时删除?
Scratch同精灵克隆体两两碰撞仅删除接触对的实现方案
原有方案失效原因
- Scratch没有内置「触碰同精灵其他克隆体」的专属积木,默认的
touching [Sprite2 v]检测会将克隆体自身纳入判定范围,直接使用会出现克隆体判定碰到自己的误判。 - 同色碰撞检测卡顿死循环,是因为没有加碰撞处理互斥锁,所有克隆体同时触发判定、同时执行删除逻辑,导致帧循环阻塞。
- 直接将外部写好的
touching [Sprite2 v]逻辑移入Sprite2内部不生效,核心是没有排除「检测到自身」的情况,触发条件永远成立或永远不成立。
可直接复用的实现逻辑
核心逻辑为:给每个克隆体分配唯一ID,加碰撞处理互斥锁,碰撞时先标记两个接触的克隆体再执行删除,避免误判和阻塞。
第一步:初始化全局变量(Sprite2本体绿旗逻辑)
新建3个全局变量(所有精灵均可访问):
全局克隆ID计数器:初始值设为0,用于给每个新克隆体分配唯一ID正在处理碰撞:初始值设为false,作为互斥锁避免多克隆体同时触发碰撞逻辑临时接触ID:用于碰撞时传递对方克隆体的ID
绿旗触发时本体执行:
- 隐藏本体
- 把上述3个全局变量重置为初始值
- 执行你原有的克隆体生成逻辑(比如定时克隆自己、按操作克隆等原有逻辑不需要改动)
第二步:克隆体启动逻辑
在Sprite2下新建2个私有变量(仅当前克隆体独立持有,勾选「仅适用于当前克隆体」选项):我的ID、已标记删除
当作为克隆体启动时执行:
- 将
我的ID设为全局克隆ID计数器的当前值,再将全局克隆ID计数器加1,保证每个克隆体ID唯一不重复 - 将
已标记删除设为false - 显示克隆体,放入你原有的克隆体移动、交互等业务逻辑,在帧循环末尾加入碰撞检测块,参考逻辑如下:
重复执行 // 此处保留你原有的克隆体移动、交互逻辑,不需要改动 【原有逻辑块】 // 以下为新增碰撞检测逻辑 如果 <<(已标记删除) = [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.
相关产品推荐
相关产品推荐

