1

我有一个游戏,其中 Falling Nodes 掉下来并击中 Base Number Sprite Node 并且游戏逻辑从那里运行。当我从头开始设置一个新游戏时,碰撞检测完全按照它应该的方式工作。当我使用 NSCoding 从以前的保存创建游戏时,会出现我的问题。在这两种情况下(新游戏和从保存游戏继续),物理主体都是相同的 - 动态、相同大小的主体、相同的 contactTestBitMask、相同的 categoryBitMask。我已经测试了所有这些,所以我知道这是真的。物理接触委托也设置为正确的对象。但是,在保存后继续进行的游戏中,未注册联系人,我无法弄清楚原因。我唯一能想到的,

任何帮助将非常感激

    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
    }
4

1 回答 1

0

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

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

gameZone 对象是一个子节点。所以我对它以及其他关键对象进行了两次编码,这导致了我的问题。该问题与物理世界联系人委托或编码/解码无关。

于 2016-03-11T16:40:37.977 回答