Ce code se bloque car secondBody
n'est pas associé à un noeud.Crash SpriteKit: comment un corps physique peut-il perdre son association avec SKNode?
func didBegin(_ contact: SKPhysicsContact) {
// Set vars to hold bodies
var firstBody: SKPhysicsBody
var secondBody: SKPhysicsBody
// Sort bodies
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
// Handle different contacts
if firstBody.categoryBitMask == BallBitMask && secondBody.categoryBitMask == TileBitMask {
didBallTileHit(tile: secondBody.node!) // Code crashes here :(
}
...
}
1) En dehors de la fixation d'un corps physique à nil
, ce qui causerait un corps physique pour perdre association avec un nœud SpriteKit?
2) Comment un corps physique peut-il exister même sans noeud en premier lieu?
Je ne sais pas comment ce la cause réelle de votre accident est si je ne vais pas poster une réponse, mais je vais essayer de répondre vos deux questions du mieux que je peux. En ce qui concerne 1), je suppose que l'assignation d'un corps physique différent à votre nœud entraînerait la dissociation du corps physique d'origine. En ce qui concerne 2), la propriété node est faible et facultative (pour éviter un cycle de référence avec le nœud propriétaire, je suppose). Les initialiseurs de SKPhysicsBody ne prennent pas un nœud comme argument; vous passez le corps créé à la propriété 'physicsBody' d'un noeud à la place. Je crois que faire cela à son tour définit la propriété 'node' du corps en conséquence. –
Néanmoins, je suppose que le 'contact' passé à votre méthode (est-ce un délégué de collision de quelque sorte?) Ne contient aucun corps de physique détaché (c'est-à-dire, des corps qui n'appartiennent pas à un nœud); Quel serait le but? –
@NicolasMiari précisément, quel est le point d'un corps détaché? d'où la confusion sur ce qui se passe! Aucune suggestion? – Crashalot