在某些接触/碰撞检测后移除物体的更好方法是什么:
发生联系时在didBeginContact / didEndContact中将其删除。
在整个物理模拟完成后,将需要移除的对象添加到数组中并在didSimulatePhysics中将其删除
将联系人(SKPhysicsContact)对象放入数组并在update方法中处理(从didBeginContact / didEndContact中删除一切自定义方法并在更新中调用:)并在处理完所有联系后继续执行步骤2。
答案 0 :(得分:2)
在我所见过的所有代码中以及我所做过的所有事情中,选项1似乎是最佳选择。
原因是didBeginContact具有处理冲突所需的一切。每次调用它时,都会有一个新的SKPhysicsContact对象,它允许您识别碰撞中的所有内容。如果你需要删除一个对象,那么为什么不在那里删除它,或者从didBeginContact里面调用另一个方法。此外,在时间方面,您在didBeginContact内部的控制比参与更新或尝试使用didSimulatePhysics时更多。它通过调用update来使它变得不必要地复杂化;每次发生碰撞时你都会重写数组,以确保你没有使用旧的SKPhysicsContact对象。 但是,每种情况都不同,所以当其他选项更合适时,现在很难判断。
编辑:有时最好不要使用didBeginContact。例如,如果你想在碰撞中改变位置或移除受影响的物体,但同时想要看到物理体的弹性碰撞,那么你就不想改变didBeginContact。