解码后,iOS SpriteKit碰撞检测失败

时间:2016-03-08 18:16:27

标签: swift sprite-kit skphysicsbody skphysicsworld skphysicscontact

我有一个游戏,其中Falling Nodes掉落并击中Base Number Sprite Node并从那里运行游戏逻辑。当我从头开始设置一个新游戏时,碰撞检测正是如此。当我使用NSCoding从之前的保存创建游戏时,会出现问题。在这两种情况下(新游戏并从保存游戏继续),物理主体是相同的 - 动态的,相同大小的主体,相同的contactTestBitMask,相同的categoryBitMask。我测试了所有这些,所以我知道这是真的。物理联系人委托也设置为正确的对象。然而,在从保存继续的游戏中,联系人没有注册,我无法弄清楚原因。我唯一能想到的,但我无法弄清楚的是被设置为我的物理联系委托的对象,并且是我希望碰撞检测的对象的父对象,在没有实际调用decodeObjectForKey的情况下进行加载/取消归档。

非常感谢任何帮助

    func initBaseNumberSpritePhysicsBody() {
        baseNumberSprite.physicsBody = nil
        baseNumberSprite.physicsBody = SKPhysicsBody(rectangleOfSize: baseNumberSprite.size)
        baseNumberSprite.physicsBody!.categoryBitMask = baseNumberCategory
        baseNumberSprite.physicsBody!.contactTestBitMask = fallingNodeCategory
        baseNumberSprite.physicsBody!.collisionBitMask = 0
        baseNumberSprite.physicsBody!.usesPreciseCollisionDetection = true
        baseNumberSprite.physicsBody!.allowsRotation = false
    }

    func initPhysicsBodyForFallingNode(node: NumberNode) {
        node.physicsBody = nil
        node.physicsBody = SKPhysicsBody(rectangleOfSize: node.size)
        node.physicsBody!.categoryBitMask = fallingNodeCategory
        node.physicsBody!.contactTestBitMask = baseNumberCategory
        node.physicsBody!.collisionBitMask = 0
        node.physicsBody!.allowsRotation = false
        node.physicsBody!.velocity = nodeVelocity
    }

    func didBeginContact(contact: SKPhysicsContact) {

        if isContactBetween(fallingNodeCategory, and: baseNumberCategory, contact: contact) {
            handleContactBetweenFallingNodeAndBaseNumber(contact)
        } else {
            print("\nUNKNOWN CONTACT OCCURED\n")
        }

        updateInternalState()
        checkGameOverCondition()
    }


    required init?(coder aDecoder: NSCoder) {
//        gameZone = aDecoder.decodeObjectForKey(gameZoneKey) as! GameZone
        super.init(coder: aDecoder)

        gameZone = self.children[0] as! GameZone  //Not decoded by itself but somehow decoded with the this GameScene Object (the "self" object here)
        gameZone.delegate = self
        self.physicsWorld.contactDelegate = gameZone
    }

    override func encodeWithCoder(aCoder: NSCoder) {
        super.encodeWithCoder(aCoder)
        aCoder.encodeObject(gameZone, forKey: gameZoneKey)  //Gets coded
    }

1 个答案:

答案 0 :(得分:0)

我能够在这里找出自己的问题。我缺乏的基本理解是SKNodes编码自己的子节点。

//        gameZone = aDecoder.decodeObjectForKey(gameZoneKey) as! GameZone

gameZone对象是子节点。所以我编码它以及其他两个关键对象导致我的问题。问题与物理世界联系代表或编码/解码无关。