在Sprite Kit中执行你自己的物理计算

我试图使用Sprite Kit来设置一些弹性碰撞。 在Sprite Kit物理碰撞问题中我问到了多个物体彼此靠近的情况

我很困惑碰撞的时机。

我试图在-didBeginContact: delegate方法中设置dynamicNO ,计算最终速度,然后在-didEndContact:dynamic设置为YES ,然后正确设置速度。

我希望它在碰撞之外是dynamic的原因是因为我想要摩擦/重力等等。 订单/逻辑有什么问题? 我看着-didSimulatePhysics方法,但它似乎不是要走的路。

我试图使用Sprite Kit来设置一些弹性碰撞

我认为你在这里误解了物理学。 弹性碰撞是碰撞的过分简单化。 实际上,没有碰撞导致能量的完美传递。 我在这里解释了这个物理的一个答案,你所连接的相关问题。

我怀疑通过阅读,你会看到一个“弹性”的碰撞可以在SpriteKit中完成,但大多数人没有意识到你需要在对象之间的空间。 你不需要做自己的物理计算。

我不确定这是否正是你想要做的,但是如果我想在没有SpriteKit帮助的情况下计算碰撞结果,同时将所有其他物理体都留给SpriteKit,我会执行以下操作:

  1. 保持dynamic属性始终设置为YES
  2. 为每种对象设置categoryBitMask属性。
  3. 将对象的collisionBitMask属性设置为要为其保留自动碰撞计算的所有categoryBitMasks(例如,墙壁,而不是其他对象)的分离,或者如果要手动处理所有冲突,请将其设置为零。
  4. 将对象的contactTestBitMask属性设置为您要手动计算碰撞的任何对象。
  5. 计算并设置didBeginContact所有速度。

(简而言之,排除你自己collisionBitMask物体的距离)。

此链接可能会有帮助: 使用碰撞和联系人

  1. 使用applyImpulse代替setVelocity。 你想要使用冲动或力量,以确保物理引擎可以正常预热。 使用setVelocity对于非常接近或重叠的对象将产生不可预知的结果。

  2. 确保物体之间有一定的距离,并且它们不重叠。

  3. 正确设置冲突位掩码。

这应该都是完美的。