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