将测试与规则相匹配
对于轴对齐的矩形,比较每个对象的左、右、上、下边界;只有在两个轴上的区间都相交时才算重叠。对于圆形,比较圆心距离与半径之和。网格游戏可以直接检查两个角色是否占据同一个格子,从而完全避免几何运算。
创建一个包含两个彩色形状的小型诊断场景,并显示选定的碰撞区域。分别测试边缘接触、部分重叠以及擦身而过但未碰撞的情况。明确边缘接触是否算碰撞,并统一采用这一约定,避免移动判定和得分判定互相矛盾。
避免漏掉快速穿越障碍的碰撞
快速移动的物体可能在一次更新时位于薄墙一侧,下一次更新时已经到了另一侧。缩小固定模拟步长可能有帮助,但并非唯一办法:当移动距离相对于障碍厚度很大时,可以测试运动扫掠线段或扩大目标区域。
对于许多对象,首先使用粗网格或空间桶拒绝不能彼此靠近的对,然后对候选对象运行详细的测试。添加该结构之前进行测量;对于几十个实体,直接的配对检查可能更容易维护并且完全足够。
关于游戏碰撞检测的常见问题
碰撞箱需要匹配精灵轮廓吗?
通常不需要。稍微宽松的矩形或圆形碰撞区域会让操作感觉更公平。开发时显示碰撞框,并根据游戏规则和玩家预期调整它们。
Canvas 可以告诉我两个精灵是否发生碰撞吗?
Canvas 提供 isPointInPath() 等路径测试,可检查某个点是否位于绘制路径内,但不会定义通用的游戏对象碰撞规则。应明确设置模拟几何形状,并让它独立于绘图。
延伸阅读
发现信息过时了? 报告需要更正的内容