# 使用适合形状的最简单的碰撞测试

> 选择适合您游戏的碰撞表示，减少不必要的配对检查，并诊断穿过障碍物的物体。

- URL: https://oneshotgems.ai/zh-Hans/topics/game-collision-detection
- 类别: 游戏开发者指南
- 类型: 指南
- 更新日期: 2026年10月5日

碰撞检测用于判断游戏对象是否重叠或交叉。最初选用的检测形状通常可以比美术图形简单：网格格子和平台用矩形，圆形角色用圆，不规则障碍物则用少量形状组合。先明确要判断的是接触、进入还是穿过，再选择能稳定回答该问题的测试。规则本身较粗略的游戏通常不需要逐像素检测，因为这会增加复杂度。

## 将测试与规则相匹配

对于轴对齐的矩形，比较每个对象的左、右、上、下边界；只有在两个轴上的区间都相交时才算重叠。对于圆形，比较圆心距离与半径之和。网格游戏可以直接检查两个角色是否占据同一个格子，从而完全避免几何运算。

创建一个包含两个彩色形状的小型诊断场景，并显示选定的碰撞区域。分别测试边缘接触、部分重叠以及擦身而过但未碰撞的情况。明确边缘接触是否算碰撞，并统一采用这一约定，避免移动判定和得分判定互相矛盾。

## 避免漏掉快速穿越障碍的碰撞

快速移动的物体可能在一次更新时位于薄墙一侧，下一次更新时已经到了另一侧。缩小固定模拟步长可能有帮助，但并非唯一办法：当移动距离相对于障碍厚度很大时，可以测试运动扫掠线段或扩大目标区域。

对于许多对象，首先使用粗网格或空间桶拒绝不能彼此靠近的对，然后对候选对象运行详细的测试。添加该结构之前进行测量；对于几十个实体，直接的配对检查可能更容易维护并且完全足够。

## 常见问题

**碰撞箱需要匹配精灵轮廓吗？** 通常不需要。稍微宽松的矩形或圆形碰撞区域会让操作感觉更公平。开发时显示碰撞框，并根据游戏规则和玩家预期调整它们。

**Canvas 可以告诉我两个精灵是否发生碰撞吗？** Canvas 提供 isPointInPath() 等路径测试，可检查某个点是否位于绘制路径内，但不会定义通用的游戏对象碰撞规则。应明确设置模拟几何形状，并让它独立于绘图。

## 跟随好奇心探索

- [使用增量时间，避免运动跳变](https://oneshotgems.ai/zh-Hans/topics/delta-time-in-games): 将经过的时间应用于游戏运动，选择安全的追赶策略，并在不同的刷新率和停顿后测试运动。
- [构建可靠的浏览器游戏循环](https://oneshotgems.ai/zh-Hans/topics/browser-game-loop): 构建浏览器游戏更新并围绕动画帧进行绘制，而不将模拟速度与玩家的显示刷新率联系起来。
- [对游戏物理使用固定时间步长](https://oneshotgems.ai/zh-Hans/topics/fixed-timestep-game-physics): 通过固定的模拟步骤、有限的追赶工作以及失速和碰撞测试将物理更新与渲染分开。

## 延伸阅读

- [MDN：画布 isPointInPath()](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/isPointInPath)

---
规范页面: https://oneshotgems.ai/zh-Hans/topics/game-collision-detection
