常见问题
什么是碰撞多边形?为什么需要它?
碰撞多边形是2D游戏中用于定义物体碰撞边界的几何形状。在游戏中,当两个物体需要进行碰撞检测时,物理引擎不会使用物体的视觉图片来判断碰撞,而是使用一个简化的多边形来近似物体的形状。这个多边形就是碰撞多边形。使用碰撞多边形的原因有两个:一是视觉精灵图通常有透明区域,如果用矩形包围盒会导致"明明视觉上没碰到但游戏判定已经碰撞"的情况;二是精确的碰撞形状可以提升游戏的操作手感和真实感。碰撞多边形的顶点越精确贴合物体轮廓,碰撞检测就越准确。
凸多边形和凹多边形有什么区别?应该用哪种?
凸多边形的所有内角都小于180度,形状上没有任何"凹陷"部分,任意两点连线都在多边形内部。凹多边形至少有一个内角大于180度,存在凹陷区域。在碰撞检测中,凸多边形可以直接使用 SAT(分离轴定理)等高效算法进行检测,而凹多边形需要先分解为多个凸多边形才能处理。因此,绝大多数物理引擎推荐或强制使用凸多边形。编辑器中的凸包生成功能可以自动将任意顶点集转换为凸多边形。只有在确实需要精确碰撞形状且引擎支持的情况下才考虑使用凹多边形。
为什么需要按逆时针顺序排列顶点?
逆时针顺序(Counter-Clockwise)是大多数2D图形API和物理引擎的默认顶点朝向约定。在OpenGL和WebGL中,逆时针方向排列的顶点定义的面被视为正面,顺时针方向的被视为背面。对于物理引擎,正确的顶点顺序确保碰撞法线方向正确,从而保证碰撞响应(如弹开方向)的正确性。如果顶点顺序错误(顺时针),可能会导致碰撞检测失败、碰撞响应方向反转或其他异常行为。编辑器通常会自动处理顶点顺序问题,但了解这个概念有助于排查问题。
如何导出到 Phaser 3 项目中使用?
在编辑器中完成碰撞多边形的编辑后,在导出格式中选择"Phaser 3",然后点击导出按钮。编辑器会生成符合 Phaser 3 框架 Matter.js 物理引擎要求的顶点数据格式。将导出的数据复制到剪贴板,然后在你的 Phaser 项目中,可以通过 Matter.Bodies.fromVertices() 方法加载这个碰撞多边形。具体用法是将导出的顶点数组作为该方法的参数传入,Matter.js 会自动创建对应的碰撞体。注意确保你的 Phaser 项目已经正确配置了 Matter.js 物理引擎。
导出的位置和实际位置不对应怎么办?
导出位置偏移通常是因为坐标原点的差异造成的。大多数物理引擎使用物体中心或左下角作为坐标原点,而编辑器中的坐标系可能有不同的原点设置。排查方法:首先确认编辑器的坐标原点位置(通常在画布左上角或中心);然后检查导出数据中的坐标是否需要进行偏移转换;最后在目标引擎中确认碰撞体的锚点(pivot)设置是否正确。如果使用图片作为参考,还需要确保图片的加载位置和物理体的创建位置一致。某些引擎需要手动设置碰撞体的偏移量(offset)来对齐视觉图形。
什么是凸包算法?编辑器使用了哪种?
凸包算法是计算几何中用于找到包含所有给定点的最小凸多边形的算法。常见的凸包算法包括 Graham 扫描法、Jarvis 步进法、分治法和 Andrew 单调链法等。本编辑器使用的是 Andrew 单调链算法,其基本思路是先将所有点按 x 坐标排序,然后分别构建上凸壳和下凸壳。构建过程中使用栈来维护顶点,对于每个新点,检查是否与栈顶两点构成"左转"关系,如果不是则弹出栈顶直到满足条件。该算法时间复杂度为 O(n log n),实现简单且效率高,是实际应用中最常用的凸包算法之一。
编辑器支持多少个顶点?有性能限制吗?
编辑器本身对多边形的顶点数量没有硬性限制,你可以放置任意数量的顶点。但需要注意,在实际游戏运行时,物理引擎对碰撞多边形的顶点数量有限制。例如 Box2D 引擎的多边形碰撞体最多支持8个顶点,超过则需要进行多边形简化或分解。Phaser 3 的 Matter.js 引擎也推荐使用较少顶点的多边形以获得最佳性能。一般来说,8到16个顶点的碰撞多边形足以满足大多数2D游戏的需求。过多的顶点不仅增加碰撞检测的计算开销,还会增加内存占用和数据传输成本。
UD5工具箱