【问题标题】:Why my node calls didBeginContact method when its not in the Scene为什么我的节点不在场景中时调用 didBeginContact 方法
【发布时间】: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)"
        }


    }

glemkappa categoryBitMask 节点正在发生冲突,因此 glem 变量应该是 ++ 一次,然后节点会从场景中移除,但看起来此方法在下一帧中被调用了更多次。我在日志中看到它是因为我在 glem didSet 中添加了print("\(glem)")。为什么会这样?

【问题讨论】:

  • 第一次您没有正确处理联系人。 bodyA 和 bodyB 永远不会保证某些类别,因此您需要在代码中处理它。第二,发布你如何创建你的精灵,以及你如何删除你的精灵
  • 实际上,即使我做错了什么,也总是会检测到类别。我 100% 确定调用了正确的代码。我检查了它是否添加了日志,并且 glem 节点在联系后消失了。唯一的问题是,即使第一次调用后节点消失了,这个代码也会被单次调用调用 3-6 次。
  • 如果你查看你的代码,你会为你的一种情况做两次同样的事情,(glem++) 这很糟糕,因为你最终可能无法正确复制你的代码,从而导致不必要的问题。相反,您应该执行类似 let firstBody = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask ? contact.bodyA : contact.bodyBlet secondBody = (contact.bodyA.categoryBitMask >= contact.bodyB.categoryBitMask ? contact.bodyA : contact.bodyB 之类的操作,这将保证您的类别掩码从最低到最高对齐,然后在您的代码中您只需要 1 个分支语句
  • 就重复节点调用而言,再一次,您没有展示创建节点的位置,我将假设删除仅发生在 removeFromParent 语句中。顺便说一句,removeFromParent 不会立即删除对象代码,节点会一直存在,直到更新周期完成,然后更新周期将删除它对节点的所有临时持有,如果没有其他地方正在节点持有,则该节点将被删除

标签: swift sprite-kit


【解决方案1】:

我将glem++ 更改为if contact.bodyB.node?.parent != nil{glem++} ,现在它可以正常工作了。

【讨论】:

    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多