46

我正在尝试使用 Sprite Kit 设置一些弹性碰撞。正如我在Sprite Kit 物理碰撞问题中所问的那样,多个对象彼此靠近的情况存在问题

我对发生碰撞情况的时间感到困惑。

我尝试在委托方法中设置为,计算最终速度,然后dynamic设置为,然后正确设置速度。NO-didBeginContact:-didEndContact:dynamicYES

我希望它在碰撞之外是动态的原因是因为我希望摩擦/重力等可用。顺序/逻辑有什么问题?我查看了-didSimulatePhysics方法,但它似乎不是要走的路。

4

3 回答 3

5

我正在尝试使用 Sprite Kit 设置一些弹性碰撞

我认为你误解了这里的物理原理。弹性碰撞是对碰撞的过度简化。实际上,没有碰撞会导致完美的能量转移。我在回答您链接到的相关问题时解释了这里的物理学。

我怀疑通读一遍你会发现可以在 SpriteKit 中完成“弹性”碰撞,但大多数人没有意识到你需要在对象之间留出空间。您不需要自己进行物理计算。

于 2015-05-18T21:30:43.543 回答
1

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

  1. 将该dynamic属性始终设置为YES
  2. 设置categoryBitMask每种对象的属性。
  3. 将对象的collisionBitMask属性设置为要保留自动碰撞计算(例如,墙壁,但不包括其他对象)的所有 categoryBitMask 的分离,或者如果要手动处理所有碰撞,则将其设置为零。
  4. contactTestBitMask对象的属性设置为您想要手动计算碰撞的任何内容。
  5. 计算并设置所有产生的速度didBeginContact

(简而言之,从它们自己的对象中排除你的对象collisionBitMask。)

此链接可能会有所帮助:Working with Collisions and Contacts

于 2015-05-15T13:38:23.490 回答
0
  1. 使用 applyImpulse 而不是 setVelocity。您想使用脉冲或力来确保物理引擎可以正常预热。对于非常接近或重叠的对象,使用 setVelocity 会产生不可预测的结果。

  2. 确保对象之间有一定距离并且它们不重叠。

  3. 正确设置碰撞位掩码。

这一切都应该完美无缺。

于 2015-05-19T06:00:00.940 回答