1

Falling Nodes が落下して Base Number Sprite Node にヒットし、そこからゲーム ロジックが実行されるゲームがあります。新しいゲームを最初からセットアップすると、衝突検出が正確に機能します。NSCoding を使用して以前の保存からゲームを作成すると、問題が発生します。どちらの場合も (新しいゲームとセーブ ゲームからの継続)、物理ボディは同じです - 動的、同じサイズのボディ、同じ contactTestBitMask、同じカテゴリBitMask。私はこれをすべてテストしたので、それが真実であることを知っています。物理接触デリゲートも適切なオブジェクトに設定されています。しかし、セーブから継続したゲームでは連絡先が登録されず、原因がわかりません。唯一思いつくのは、

どんな助けでも大歓迎です

    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 オブジェクトは子ノードです。そのため、他のキーオブジェクトと同様に2回エンコードしていたため、問題が発生していました。この問題は、物理ワールド コンタクト デリゲートまたはエンコード/デコードとは何の関係もありませんでした。

于 2016-03-11T16:40:37.977 に答える