物理引擎注意事项/限制

使用物理引擎时,需要注意某些行为方面和限制。本指南概述了其中最重要和最常见的方面。

群组和碰撞

当然,具有物理体的显示对象可以放置在不同的 显示群组 中,以便进行z 索引分层。但是,如果您需要检测不同群组中对象之间的碰撞,则由于底层 Box2D 功能的原因,您不应彼此独立地移动、缩放或旋转整个显示群组。

可以一致地或同步地移动、缩放或旋转一系列群组,只要这些群组保持相同的坐标原点、角度和缩放比例。但是,如果群组彼此独立地移动、缩放或旋转,Box2D 碰撞系统会将物理体视为其原始状态,而不是它们由于转换群组而显示的状态。

这也适用于 physics.setDrawMode()"hybrid""debug" 模式 — 即使这些绘制模式表明物理体由于修改群组而发生了变化,碰撞系统仍然会将它们视为其原始状态。

对象缩放

通常,不应通过 object:scale()object.xScaleobject.yScale 缩放具有物理体的显示对象。这是因为物理引擎仍然会将物理体视为其最初定义的状态。本质上,如果您放大或缩小对象,显示对象部分将在视觉上反映应用的缩放比例,但物理体不会受到影响。

过渡动画

运动

可以通过 过渡动画 移动具有物理体的显示对象,但重要的是要理解这些过渡运动独立于物理运动。因此,对物理对象使用过渡运动应谨慎处理或完全避免。

例如,如果一个物理对象在模拟重力的作用下下落,然后您应用过渡动画将其向上移动到特定垂直点,则该对象的实际屏幕上位置将由两个系统控制。然而,这两个系统并没有真正地相互感知 — 在这种情况下,重力会迫使物体向下,而过渡动画会试图将其向上拉回,从而导致尴尬的行为,每个系统都在争夺对物体的控制权。

仍然可以在物理体上使用过渡运动,但您应确保在过渡动画开始时,对象上没有相互竞争的物理力或速度。一种实现方法是通过object.isAwake = false参考)使物体进入休眠状态。这将防止全局力(如重力)在过渡动画期间影响对象,但使用此方法时要小心,因为对对象的任何直接物理影响都会导致其唤醒。

如果在过渡动画期间的任何时候发生物理交互 — 例如与另一个对象发生碰撞 — 您应立即通过 transition.cancel() 取消过渡动画,以防止两个试图控制对象的系统之间发生进一步的冲突。

关节

通常,您应该避免对由物理 关节 连接的多个不同物体组成的物理结构使用任何类型的过渡运动或旋转。如果您仅将过渡动画应用于其中一个物体,则连接到该物体的对象可能无法与单个物体上发生的过渡动画保持同步。如果过渡动画导致位置或角度快速或突然变化,则尤其如此。