1

J'ai un jeu où les noeuds de chute tombent et frappent le noeud de sprite de base et la logique de jeu est exécutée à partir de là. Lorsque je configure un nouveau jeu à partir de rien, la détection de collision fonctionne exactement comme elle le devrait. Mon problème se produit lorsque je crée un jeu à partir d'une sauvegarde précédente en utilisant NSCoding. Dans les deux cas (nouveau jeu et poursuite du jeu de sauvegarde) les corps physiques sont les mêmes - corps dynamique de même taille, même contactTestBitMask, même categoryBitMask. J'ai testé tout cela donc je sais que c'est vrai. Le délégué de contact physique est également défini sur le bon objet. Dans un jeu continué d'une sauvegarde, cependant, les contacts ne sont pas enregistrés et je ne peux pas comprendre pourquoi. La seule chose à laquelle je peux penser, mais que je n'arrive pas à comprendre est l'objet qui est défini comme délégué de contact physique et qui est le parent des objets pour lesquels je veux que la détection de collision soit chargée/désarchivée sans que je l'appelle réellement decodeObjectForKey.iOS Détection de collision SpriteKit échoue après l'enregistrement de décodage

Toute aide serait appréciée

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 
    } 

Répondre

0

j'ai pu trouver mon propre problème. Une compréhension fondamentale qui me manquait est le SKNodes encoder leurs propres nœuds enfants.

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

L'objet gameZone est un noeud enfant. Donc, je l'encodais aussi bien que d'autres objets clés deux fois qui conduisaient à mon problème. Le problème n'avait rien à voir avec le délégué au monde de la physique ou le codage/décodage.