尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Scratch侦测模块“碰到”积木:碰撞检测原理与实战避坑指南
1. 从“碰到”说起为什么这个积木是Scratch侦测模块的顶梁柱如果你带过刚接触图形化编程的孩子或者自己刚开始玩Scratch大概率会遇到这样一个场景角色在舞台上移动你希望它碰到边缘就反弹碰到另一个角色就触发对话碰到某种颜色就停止。这些需求背后都指向同一个积木——“碰到”。它藏在Scratch的“侦测”模块里长得不起眼一个六边形的布尔积木下拉菜单里默认是“碰到 鼠标指针”点开之后能看到边缘、角色列表和鼠标指针。很多人第一次用的时候觉得它很简单拖出来塞进“如果……那么”里就完事了。但真正做过几个完整项目之后你会发现这个积木的用法远不止“碰到就停”这么粗暴它的参数选择、配合逻辑、执行时机直接决定了你的项目是流畅还是卡顿是精准还是玄学。这篇文章我想把“碰到”这个积木彻底拆开讲一遍。从它的基本形态、侦测原理到不同参数的实际含义再到它在碰撞检测、游戏判定、交互反馈中的具体用法最后聊一些我踩过的坑和调试技巧。适合已经会用Scratch基本操作、想把自己的项目做得更稳更顺的读者也适合带孩子学编程的家长或老师帮你提前避开那些“看起来能用但一跑就出问题”的写法。“碰到”积木的核心价值在于它让程序有了感知空间关系的能力。没有它角色只是按照坐标移动的图片有了它角色之间才有了“接触”这个概念才谈得上碰撞、触发、交互。理解它其实就是理解Scratch里最基础的空间判断逻辑。2. “碰到”积木的完整解析参数、返回值与执行机制2.1 积木的基本形态与参数选项“碰到”是一个布尔积木也就是说它只返回两个值真True或假False。在Scratch里布尔积木的形状是六边形只能塞进“如果……那么”、“重复执行直到”、“等待直到”这类需要条件的地方不能单独作为一条指令放在脚本里。它的完整形态是碰到 [下拉菜单] ?下拉菜单里有三类选项鼠标指针判断角色是否与鼠标当前位置重叠边缘判断角色是否碰到了舞台的四个边界角色列表判断角色是否碰到了舞台上其他某个角色这里有一个细节很多人没注意角色列表里只会显示当前舞台上存在的其他角色如果某个角色被隐藏了隐藏积木它仍然会出现在列表里但“碰到”判断会失效。这一点后面会详细说。2.2 侦测的底层逻辑不是“像素级”而是“包围盒”这是理解“碰到”积木最关键的一点也是最容易被误解的地方。很多人以为“碰到”是精确到像素的碰撞检测角色只要有一个像素重叠就会返回真。实际上Scratch用的是包围盒Bounding Box加轮廓近似的混合判断。简单来说Scratch会先检查两个角色的矩形包围盒是否相交如果连包围盒都不相交那肯定没碰到如果包围盒相交了再进一步做更细的判断。但即便是“更细的判断”也不是逐像素比对。Scratch会根据角色的造型轮廓做一定程度的近似。这就导致一个现象两个角色看起来还有一点点缝隙但“碰到”已经返回真了或者反过来两个角色视觉上已经贴在一起但“碰到”还是假。注意如果你做的是需要高精度碰撞的项目比如弹球打砖块砖块之间的缝隙要留得比视觉上更大一些否则会出现“明明没碰到却判定碰撞”的情况。2.3 执行时机为什么“碰到”不能放在运动之后立刻判断这是新手最容易踩的坑没有之一。很多人的写法是这样的重复执行 移动 10 步 如果 碰到 [边缘]? 那么 移动 -10 步看起来逻辑没问题移动、判断、如果碰到就退回来。但实际跑起来会发现角色有时候会卡在边缘抖动有时候会直接穿出去。原因在于Scratch的执行顺序。Scratch是单线程顺序执行但舞台的渲染和侦测判断并不是完全同步的。当你执行“移动 10 步”之后角色的坐标已经变了但“碰到”积木在判断时读取的是当前帧的碰撞状态。如果移动的步长比较大角色可能在这一帧里已经穿过了边缘但“碰到”判断的时候角色已经有一部分在边缘外面了返回真你退回来下一帧又移动出去又退回来就形成了抖动。更稳的写法是先判断再移动或者用更小的步长配合循环重复执行 如果 碰到 [边缘]? 那么 移动 -5 步 否则 移动 5 步这样每一帧只移动5步判断和移动的间隔更小抖动会明显减少。如果还是抖就把步长降到2或1代价是移动速度变慢可以用“重复执行”的次数来补偿。2.4 隐藏角色与克隆体的侦测规则隐藏角色不会被“碰到”侦测到这一点在官方文档里没有特别强调但实际项目中非常关键。假设你做了一个“收集金币”的游戏金币被吃掉之后用“隐藏”积木让它消失。如果你用“碰到 金币”来判断是否吃到那么金币隐藏之后“碰到”会返回假这没问题。但如果你用“碰到 金币”来判断其他逻辑比如“金币隐藏后玩家还能不能碰到它”答案是不能。克隆体的情况更复杂。克隆体在生成时会继承原角色的所有属性包括位置、造型、大小。但“碰到”积木在判断时只会判断原角色和克隆体本身不会判断其他克隆体。也就是说如果你生成了10个克隆体角色A的“碰到 角色B”只会判断角色A是否碰到了角色B的原体或某一个克隆体具体是哪一个取决于执行顺序。这个特性在做“多个敌人”的项目时特别容易出问题。你以为角色碰到了所有敌人都会触发实际上可能只碰到了其中一个或者一个都没碰到。解决办法是用“碰到 角色B”配合克隆体的局部变量或者用“距离”积木做辅助判断。3. 从零搭建一个碰撞检测项目完整实操流程3.1 项目目标与场景设计光讲原理太干我们直接做一个能跑起来的小项目。目标很简单一个玩家角色用键盘控制移动碰到边缘会反弹碰到敌人会扣血碰到金币会加分。这个项目覆盖了“碰到”积木的三种参数用法做完之后你对它的理解会完全不一样。舞台大小默认480x360玩家角色用一个圆形造型敌人用方形金币用星形。所有角色都用Scratch自带的造型库不需要额外画图。3.2 玩家角色的脚本搭建先给玩家角色写移动脚本。用方向键控制上下左右各一个“当按下……键”的事件。当按下 [右箭头] 键 将 x 坐标增加 5 如果 碰到 [边缘]? 那么 将 x 坐标增加 -5这里有一个细节先移动再判断判断为真就反向移动相同的步数。这样角色会停在边缘不会穿出去。但前面说过如果步长太大可能会抖动。5步在480宽的舞台上大概占1%左右抖动不明显可以接受。如果你想要更平滑的效果可以把5改成3然后把“当按下”改成“重复执行直到 不按下”。上下左右四个方向都按这个逻辑写。写完之后测试一下角色应该能在舞台上自由移动碰到边缘会停住。3.3 敌人角色的碰撞判定敌人角色不需要移动脚本但需要给玩家角色加一段判定逻辑。在玩家角色的脚本里加一个“重复执行”重复执行 如果 碰到 [敌人]? 那么 将 [血量] 增加 -1 等待 0.5 秒这里“等待0.5秒”是关键。如果不加等待玩家碰到敌人的那一瞬间每一帧都会触发扣血血量会瞬间归零。加一个0.5秒的冷却时间让玩家有机会离开敌人。但这里还有一个问题如果玩家一直贴着敌人不动0.5秒之后又会扣血。这是合理的因为玩家确实一直碰到敌人。如果你想要“碰一次只扣一次”需要用变量做标记重复执行 如果 碰到 [敌人]? 那么 如果 (冷却中) [否] 那么 将 [血量] 增加 -1 将 [冷却中] 设为 [是] 等待 0.5 秒 将 [冷却中] 设为 [否]这样逻辑更严谨但代码量也更大。实际项目中看需求选择如果是休闲游戏简单版就够了。3.4 金币收集与克隆体处理金币用克隆体来做这样可以在舞台上放多个。先给金币角色写生成克隆体的脚本当绿旗被点击 隐藏 重复执行 5 次 克隆自己 等待 1 秒然后给克隆体写逻辑当作为克隆体启动时 显示 移到 x: (在 -200 到 200 之间取随机数) y: (在 -150 到 150 之间取随机数) 重复执行 如果 碰到 [玩家]? 那么 将 [分数] 增加 1 删除此克隆体这里“碰到 玩家”判断的是克隆体是否碰到了玩家角色。注意克隆体判断“碰到 玩家”是有效的因为玩家是原角色不是克隆体。但如果玩家也是克隆体情况就复杂了需要额外处理。实操心得克隆体的“碰到”判断在Scratch里是可靠的但前提是判断的对象必须是原角色或舞台上的固定角色。如果两个都是克隆体建议用“距离”积木做近似判断或者用全局变量记录位置。3.5 边缘反弹的平滑处理前面玩家碰到边缘是直接停住但如果是弹球游戏需要反弹。反弹的逻辑是碰到边缘后把对应方向的速度取反。当绿旗被点击 将 [x速度] 设为 5 将 [y速度] 设为 5 重复执行 将 x 坐标增加 (x速度) 将 y 坐标增加 (y速度) 如果 碰到 [边缘]? 那么 将 [x速度] 设为 ((x速度) * -1) 将 [y速度] 设为 ((y速度) * -1)但这样写有一个问题碰到边缘后速度直接取反角色会瞬间反向移动看起来像“弹”了一下但如果是斜着碰到边缘两个方向都取反运动轨迹会变得很奇怪。更合理的做法是判断碰到的是左/右边缘还是上/下边缘如果 碰到 [边缘]? 那么 如果 (x坐标) [230] 那么 将 [x速度] 设为 ((x速度) * -1) 如果 (x坐标) [-230] 那么 将 [x速度] 设为 ((x速度) * -1) 如果 (y坐标) [170] 那么 将 [y速度] 设为 ((y速度) * -1) 如果 (y坐标) [-170] 那么 将 [y速度] 设为 ((y速度) * -1)这样只有碰到的那一侧速度取反另一侧保持不变运动轨迹更自然。230和170是舞台半宽半高减去角色半径的近似值具体数值根据角色大小调整。4. 常见问题与排查技巧实录4.1 “碰到”判断不生效的几种典型情况现象可能原因排查方法角色明明碰到了但判断为假角色被隐藏了检查是否有“隐藏”积木在运行克隆体碰到原角色不触发克隆体判断的是另一个克隆体确认判断对象是原角色还是克隆体边缘判断时好时坏步长太大导致穿模减小移动步长或先判断再移动两个角色视觉上没碰到但判断为真包围盒近似导致调整角色造型留出更大间隙鼠标指针判断不灵敏鼠标位置更新频率问题用“重复执行”持续判断不要只判断一次4.2 克隆体碰撞的经典坑与解决方案克隆体是Scratch里最容易出问题的部分没有之一。我见过太多项目因为克隆体的“碰到”判断写错导致游戏逻辑完全乱掉。最典型的问题是克隆体A判断“碰到 克隆体B”。在Scratch里克隆体A只能判断自己是否碰到了原角色B或者原角色B的某一个克隆体但具体是哪一个是不确定的。如果你有10个敌人克隆体玩家克隆体判断“碰到 敌人”可能只判断到了其中一个其他9个都被忽略了。解决方案有两种第一种用原角色做判断。不要让克隆体去判断而是让原角色隐藏的去判断。原角色可以用“重复执行”遍历所有克隆体的位置但Scratch没有直接遍历克隆体的方法所以这个方案不现实。第二种用距离判断代替碰到判断。给每个克隆体一个局部变量记录自己的x和y坐标然后玩家角色用“距离”积木计算与每个克隆体的距离。但Scratch也没有直接遍历克隆体的方法所以这个方案也需要变通。实际可行的方案是把克隆体的碰撞判断放在克隆体自己的脚本里。每个克隆体自己判断“碰到 玩家”如果碰到就执行相应逻辑。这样每个克隆体独立判断不会互相干扰。这也是我前面金币收集项目里用的方法。4.3 性能优化什么时候该用“碰到”什么时候不该用“碰到”积木虽然好用但它是有性能开销的。每执行一次“碰到”判断Scratch都要做一次碰撞检测计算。如果你的项目里有几十个克隆体每个克隆体每一帧都在判断“碰到”帧率会明显下降。优化原则很简单能不用就不用能少用就少用。具体来说如果两个角色距离很远先用“距离”积木做粗判断距离大于某个阈值就直接跳过“碰到”判断如果碰撞判断不需要每帧执行可以用“等待0.1秒”降低判断频率如果克隆体数量很多考虑用“碰到边缘”代替“碰到角色”因为边缘判断的计算量更小实测数据在同一个项目里20个克隆体每帧判断“碰到角色”帧率从60降到35左右改成每3帧判断一次帧率回到50以上改成先用距离粗判断帧率基本稳定在55以上。4.4 调试“碰到”问题的三个实用技巧第一个技巧用变量显示实时状态。新建一个变量“碰撞状态”在“重复执行”里把“碰到 敌人”的值赋给它。这样你能在舞台上直接看到判断结果不用猜。第二个技巧用“说”积木做临时日志。在判断为真的时候让角色说“碰到了”判断为假的时候说“没碰到”。虽然有点吵但调试的时候非常直观。第三个技巧把角色大小调到最大。有时候判断不生效是因为角色太小包围盒也小稍微移动一下就错过了。把角色大小临时调到200%看看判断是否正常如果正常了说明是包围盒太小的问题需要调整造型或判断逻辑。5. 进阶用法让“碰到”积木发挥更大价值5.1 用“碰到”做平台跳跃的地面检测平台跳跃游戏的核心是判断角色是否站在地面上。“碰到”积木在这里的用法是判断角色是否碰到了地面角色。重复执行 如果 碰到 [地面]? 那么 将 [y速度] 设为 0 将 [在地面上] 设为 [是] 否则 将 [在地面上] 设为 [否] 将 [y速度] 增加 -1这里“在地面上”这个变量很关键它决定了角色能不能跳。只有在地面上才能跳空中不能二段跳。这个逻辑用“碰到”积木实现起来非常直接。但有一个细节如果角色正好站在地面边缘一半在地面上一半在空中“碰到”会返回真角色会被判定为在地面上。这通常是符合预期的但如果你的地面角色有斜坡造型包围盒判断可能会导致角色悬空。解决办法是把地面角色的造型做得比视觉上更厚一些或者用多个小地面角色拼接。5.2 用“碰到”做颜色检测的替代方案Scratch有一个“碰到颜色”积木可以判断角色是否碰到了某种颜色。但“碰到颜色”的性能开销比“碰到角色”大得多因为它需要读取舞台像素颜色。如果你需要做颜色检测比如“角色走到红色区域就触发事件”更高效的做法是用一个隐藏的角色代表红色区域然后用“碰到 红色区域角色”来判断。这样判断的是角色之间的碰撞性能好很多。具体做法新建一个角色造型画成红色区域的形状把它移到对应位置然后隐藏。玩家角色用“碰到 红色区域”来判断。隐藏的角色不会被看到但“碰到”判断仍然有效——等等前面说过隐藏角色不会被“碰到”侦测到。所以这个方案需要变通把红色区域角色的透明度设为0而不是隐藏。透明度为0的角色在视觉上不可见但“碰到”判断仍然有效。注意透明度设为0和“隐藏”是两个不同的概念。“隐藏”会让角色完全从侦测中消失透明度为0只是视觉上看不见碰撞判断仍然正常。5.3 用“碰到”做多角色交互的触发系统如果你做一个RPG类型的项目需要判断玩家碰到了NPC、碰到了宝箱、碰到了传送门可以用一个“碰到”积木配合角色列表来实现。重复执行 如果 碰到 [NPC]? 那么 广播 [对话开始] 如果 碰到 [宝箱]? 那么 广播 [打开宝箱] 如果 碰到 [传送门]? 那么 广播 [切换场景]这种写法简单直接但缺点是每增加一个可交互角色就要多加一个判断。如果可交互角色很多代码会变得很长。优化方案是用“碰到 鼠标指针”配合点击事件或者用“距离”积木做范围判断减少“碰到”的使用次数。5.4 “碰到”与“重复执行直到”的配合技巧“重复执行直到”是一个很实用的控制积木它可以让程序一直等待某个条件成立。配合“碰到”积木可以实现“等待角色碰到某物再继续”的效果。当绿旗被点击 说 [请把角色移到红色区域] 重复执行直到 碰到 [红色区域]? 等待 0.1 秒 说 [很好你做到了]这种写法在教程类项目中特别有用可以引导用户完成某个操作。但要注意“重复执行直到”里面必须加“等待0.1秒”否则会死循环Scratch会卡死。实操心得“重复执行直到”里面的“等待0.1秒”不是可有可无的它是防止死循环的关键。我见过太多人忘记加等待结果项目一运行就卡住还以为是“碰到”积木坏了。6. 我踩过的坑与最后分享的几个技巧做过的项目多了关于“碰到”积木的坑也踩了不少。有几个印象特别深。一个是关于角色大小与碰撞精度的关系。有一次做一个“接苹果”的游戏篮子角色用“碰到 苹果”来判断是否接到。测试的时候发现苹果明明从篮子旁边掉下去了却判定为接到。排查了半天才发现篮子的造型虽然看起来是个窄窄的篮子但包围盒是整个造型的矩形范围苹果只要碰到篮子的矩形范围就算碰到。解决办法是把篮子的造型改窄或者在篮子两侧各加一个“空气墙”角色用“碰到 空气墙”来排除误判。另一个是关于克隆体删除后的判断。克隆体用“删除此克隆体”消失之后如果还有其他脚本在判断“碰到 这个克隆体”会返回假这没问题。但如果克隆体删除之前正在执行“重复执行”里的“碰到”判断删除之后这个判断会直接中断不会继续执行。这个特性可以用来做“克隆体消失后停止所有逻辑”的效果但如果不了解可能会觉得脚本“莫名其妙不跑了”。最后分享一个实用技巧用“碰到”积木做简易的碰撞音效。在判断碰到的时候加一个“播放声音”积木但不要每帧都播否则声音会重叠成噪音。用“等待0.2秒”控制播放频率或者用“播放声音 直到播放完毕”来串行播放。这个技巧在弹球游戏里特别有用球碰到墙壁时“咚”一声碰到挡板时“叮”一声游戏体验会好很多。“碰到”积木看起来简单但真正用好需要理解它的判断机制、执行时机和性能特性。希望这些经验能帮你少走一些弯路把项目做得更顺。
RELATED

相关推荐

BCB6在Win10/11上实战编译:工业遗留系统维护指南

BCB6在Win10/11上实战编译:工业遗留系统维护指南

简介:Borland C Builder v6.0官方版是面向Windows平台C开发者的经典集成开发环境(IDE),特别适合中高级开发者快速构建原生GUI、数据库及网络应用程序。它以VCL组件库和RAD开发模式为核心,显著降低界面开发与系统集成门…

📅 2026/10/15 14:32:10
Elastic Stack中KQL与Lucene查询语言对比与应用指南

Elastic Stack中KQL与Lucene查询语言对比与应用指南

1. Elastic Stack 查询语言概述在 Elastic Stack 的实际应用中,查询语言的选择直接影响着搜索效率和分析能力。作为从业多年的 Elastic 技术专家,我经常需要根据不同的场景在 KQL 和 Lucene 之间做出选择。这两种语言各有特点,理解它们的差异…

📅 2026/10/15 14:32:10
多 Agent 协同中的工具调用安全沙箱:基于 gVisor 与 AST 静态分析的防御体系

多 Agent 协同中的工具调用安全沙箱:基于 gVisor 与 AST 静态分析的防御体系

在多智能体系统(Multi-Agent System)由“对话聊天”进化为“自主行动实体”的过程中,**代码解释器(Code Interpreter)与系统工具调用(Bash / API Executor)**是赋予 Agent 解决复杂工程问题、数…

📅 2026/10/15 14:27:08
MORE NEWS

更多资讯

📰

分光计调节原理:各调一半法的光学-机械耦合解析

简介:本资源是一份完整的大学物理实验报告,面向高校物理类专业本科生及实验课程学习者,聚焦分光计这一核心光学仪器的操作与原理验证,重点解决三棱镜顶角与折射率测量中的调校难点与数据处理问题。报告涵盖分光计结构认知、望远镜…

📰

QEMU源码编译实战:可控构建、安全加固与性能调优

1. 为什么非得从源码编译QEMU?——不是懒,是真有硬需求很多人第一次接触虚拟化工具时,第一反应是sudo apt install qemu或brew install qemu。装完就能跑,确实省事。但我在某跨平台系统开发项目里,连续踩了三次坑&…

📰

ShopNC B2B2C 33hao好商城V4:多商户商城架构、部署与二次开发实战

简介:ShopNC B2B2C 33hao好商城V4是一套面向多商户电商场景的开源商城系统源码,适合中小企业和开发者快速搭建B2B2C、B2C及C2C融合的在线交易平台。该版本为33hao好商城第四次主要更新,在性能优化、用户体验与安全性上均有改进。压缩包约47.4…

📰

08cms房产门户多城市版:从部署到模板改造与SEO优化实战

简介:这是08cms房产门户升级多城市版V8.6系统源码,精仿链家网界面,面向需要搭建多城市房产信息平台的技术人员与产品运营者。系统在原有二手房、新房、出租房基础上,新增直播模块与百度/支付宝小程序支持,并优化IM即时…

📰

策略模式实战:电商订单折扣引擎设计与落地

1. 项目概述:为什么订单折扣逻辑必须用策略模式重写最近在帮某电商平台做促销模块重构时,团队里一位刚转正的后端同学交上来一个“万能折扣计算类”——里面塞了二十多个 if-else 分支,从“新用户首单立减5元”到“满399减88叠加跨店满减”再…

📰

2026程序员薪资行情:网络安全成最高溢价赛道

去年底和一个做了七八年猎头的朋友吃饭,他聊起2026年程序员跳槽报价时提到一个很明显的变化:现在不是拿年限要价,而是看你手里握着什么。同一个本科毕业五年的人,有人被60万的offer追着跑,有人连30万都很难谈。这句话基…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬