【发布时间】:2015-12-11 22:01:51
【问题描述】:
func didBeginContact(contact: SKPhysicsContact) {
if contact.bodyA.categoryBitMask == PhysicsCategory.overPow || contact.bodyB.categoryBitMask == PhysicsCategory.overPow{
let sk = delegateForCollision!.view as! SKView
let newScene = GG(fileNamed: "GG")
newScene!.delegateFor = delegateForCollision
newScene?.scaleMode = .AspectFill
sk.presentScene(newScene)
}
if contact.bodyA.categoryBitMask == PhysicsCategory.glem && contact.bodyB.categoryBitMask == PhysicsCategory.kappa{
contact.bodyA.node?.removeFromParent()
glem++
glemLabel.text = "SKAŁY: \(glem)"
}
if contact.bodyB.categoryBitMask == PhysicsCategory.glem && contact.bodyA.categoryBitMask == PhysicsCategory.kappa{
contact.bodyB.node?.removeFromParent()
glem++
glemLabel.text = "SKAŁY: \(glem)"
}
}
glem 和 kappa categoryBitMask 节点正在发生冲突,因此 glem 变量应该是 ++ 一次,然后节点会从场景中移除,但看起来此方法在下一帧中被调用了更多次。我在日志中看到它是因为我在 glem didSet 中添加了print("\(glem)")。为什么会这样?
【问题讨论】:
-
第一次您没有正确处理联系人。 bodyA 和 bodyB 永远不会保证某些类别,因此您需要在代码中处理它。第二,发布你如何创建你的精灵,以及你如何删除你的精灵
-
实际上,即使我做错了什么,也总是会检测到类别。我 100% 确定调用了正确的代码。我检查了它是否添加了日志,并且 glem 节点在联系后消失了。唯一的问题是,即使第一次调用后节点消失了,这个代码也会被单次调用调用 3-6 次。
-
如果你查看你的代码,你会为你的一种情况做两次同样的事情,(glem++) 这很糟糕,因为你最终可能无法正确复制你的代码,从而导致不必要的问题。相反,您应该执行类似
let firstBody = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask ? contact.bodyA : contact.bodyB和let secondBody = (contact.bodyA.categoryBitMask >= contact.bodyB.categoryBitMask ? contact.bodyA : contact.bodyB之类的操作,这将保证您的类别掩码从最低到最高对齐,然后在您的代码中您只需要 1 个分支语句 -
就重复节点调用而言,再一次,您没有展示创建节点的位置,我将假设删除仅发生在 removeFromParent 语句中。顺便说一句,removeFromParent 不会立即删除对象代码,节点会一直存在,直到更新周期完成,然后更新周期将删除它对节点的所有临时持有,如果没有其他地方正在节点持有,则该节点将被删除
标签: swift sprite-kit