我在 spritekit 中的冲突和代码触发方式方面遇到了一些问题。我正在使用物理接触委托和标准位掩码。碰撞一次只发生在两个对象之间。我希望检测到冲突,然后执行以下代码一次。不幸的是,对象之间在多个点上存在接触,这导致代码多次触发。我的代码设置为在代码运行之前删除节点,但我仍然遇到此问题。我如何确保在单个点检测到冲突或代码只运行一次,提前感谢。
是的 - 这会发生。处理它的方法是(在某些情况下,你不能让 sprite-kit 不多次调用didBegin
)是确保您的联系代码适应这一点,并且多次处理合约不会导致问题(例如多次添加到分数、删除多个生命、尝试访问已被删除的节点或 physicsBody 等)。
这里有一个讨论:Sprite-Kit为单个联系人注册多个冲突
您可以执行的一些操作包括:
- 如果删除已联系的节点,请检查该节点是否在之前
nil
你删除它(对于重复的联系人) - 将节点添加到集合,然后删除集合中的所有节点
didFinishUpdate
- 将"非活动"标志添加到节点的
userData
- 使节点成为 SKSpriteNode 的子类并添加
inactive
属性
等等 - 等等。
你的问题有点不清楚,但我想我过去可能遇到过类似的问题。
您是否尝试过将 SKPhysicsBody(碰撞后要删除的节点)设置为 nil?如果这是您在发生碰撞后做的第一件事,它不会记录任何其他冲突,只会执行您设置过一次的任何代码。