Scratch中墙体角度检测方案咨询(Portal主题2D平台游戏)
Scratch中Portal与墙体精准对齐的墙体角度检测方案
核心方案:基于射线投射的墙体角度计算
你方向找对了——要让Portal和任意角度墙体完全对齐,必须通过射线投射采样墙体边缘,再通过几何计算得到准确角度。
1. 射线投射采样有效碰撞点
在Portal触发吸附的瞬间,从其中心向周围多个方向(比如8个方向:0°、45°…315°)发射短射线,记录射线与墙体的碰撞坐标。关键是要拿到两个不同的有效碰撞点——这是计算角度的基础。
- 伪代码逻辑(适配Scratch逻辑):
注意:过滤掉距离过近的点(比如小于10像素),避免是同一边缘的重复采样。触发吸附事件时: 清空碰撞点列表 循环遍历8个方向角度: 创建临时射线角色,从Portal中心沿当前方向移动 若碰到墙体,记录当前坐标到列表 删除临时射线角色 从列表中筛选出距离最远的两个点(确保是同一段墙体的两端)
2. 两点计算墙体角度
拿到两个碰撞点(x1,y1)和(x2,y2)后,用几何公式推导角度:
- 计算水平差
dx = x2 - x1,垂直差dy = y2 - y1 - 用反正切函数计算角度:
angle = atan(dy/dx)(Scratch中atan返回弧度,需用弧度转角度模块转换) - 特殊情况处理:
- 当
dx = 0时,墙体为垂直方向(90°或270°) - 当
dy = 0时,墙体为水平方向(0°或180°)
- 当
3. Portal角度对齐与平滑处理
计算出目标角度后,直接设置Portal的旋转角度即可。为避免角度突变,可加入平滑过渡:
- 伪代码逻辑:
这个系数目标角度target_angle = 计算得到的墙体角度 当前角度current_angle = Portal的当前旋转角度 设置Portal角度为 current_angle + (target_angle - current_angle) * 0.10.1可以调整,数值越小过渡越平滑。
Scratch内的落地技巧
- 模拟射线:Scratch无原生射线,可用极小的临时角色(比如1x1像素)沿方向移动,碰到墙体时记录坐标,随后删除角色。
- 旋转中心调整:Portal是矩形,对齐时可能需要调整旋转中心到吸附边缘,避免偏移——用
将旋转中心设为(x,y)模块,把中心移到与墙体接触的一侧。 - 方块墙体优化:如果你的墙体是由预制方块组成的,可直接给方块添加
角度属性,吸附时直接读取该属性,比射线投射更高效。
内容的提问来源于stack exchange,提问作者toastypixelcrisps
相关产品推荐
相关产品推荐

