PhysicsBody no usa SpriteKit con Swift

Tengo un juego SpriteKit que estoy construyendo y estoy cargando un nivel de una matriz multidimensional. La function de nivel de carga funciona la primera vez. No funciona si hago una println del println de la physicsBody encima de la asignación de physicsBody (después de la initialization del cuerpo físico). Cuando removeChildrenInArray todos los mosaicos con removeChildrenInArray la segunda vez que ejecuto el nivel de carga arroja un error que dice fatal error: unexpectedly found nil while unwrapping an Optional y apunta a la línea justo debajo de la println continuación. Y la println indica que es el physicsBody que es nil . En mi opinión, no hay ninguna razón para que una PhysicsBody initialization de PhysicsBody nunca sea nil . La println imprime a physicsBody nil . No tengo idea de por qué el physicsBody sería nil . Solo trato de restablecer el nivel eliminando todos los nodos de bloque y agregando otros nuevos en el lugar original de acuerdo con el map de niveles.

 func loadLevel() { var levels = Levels().data var frameSize = view.frame.size var thisLevel = levels[currentLevel] println("running load level") for (rowIndex,row) in enumerate(thisLevel) { for (colIndex,col) in enumerate(row) { if col == 4 { continue } println("COL: \(col)") var tile = SKSpriteNode(texture: SKTexture(imageNamed: "brick_\(tileMap[col])")) tile.name = "tile_\(rowIndex)_\(colIndex)" tile.position.y = frameSize.height - (tile.size.height * CGFloat(rowIndex)) - (tile.size.height/2) tile.position.x = tile.size.width * CGFloat(colIndex) + (tile.size.width/2) var physicsBody = SKPhysicsBody(rectangleOfSize: tile.size) tile.physicsBody = physicsBody tile.physicsBody.affectedByGravity = false tile.physicsBody.categoryBitMask = ColliderType.Block.toRaw() tile.physicsBody.contactTestBitMask = ColliderType.Ball.toRaw() tile.physicsBody.collisionBitMask = ColliderType.Ball.toRaw() scene.addChild(tile) tileCount++ } } } 

Aquí está mi ColliderType

 enum ColliderType:UInt32 { case Paddle = 1 case Block = 2 case Wall = 3 case Ball = 4 } 

Este es el contenido de mi function de reinicio:

 func reset() { tileCount = 0 var removeTiles = [SKSpriteNode]() // remove all the tiles for child in scene.children { var a_tile = child as SKSpriteNode if a_tile.name.hasPrefix("tile_") { a_tile.removeFromParent() a_tile.name = "" removeTiles.append(a_tile) } } removeTiles.removeAll(keepCapacity: false) ball!.position = CGPoint(x: 200, y: 200) ballVel = CGPoint(x: 0, y: -5) currentLevel++ loadLevel() lost = false won = false } 

Aquí están mis estructuras de Level

 struct Tile { let map = ["blue","green","purple","networking"] } struct Levels { let data = [ [ [4,4,0,4,0,4,0,4,0,4,0,4,0,0,4,4], [4,4,1,4,1,4,1,4,1,4,1,4,1,1,4,4], [4,4,2,4,2,4,2,4,2,4,2,4,2,2,4,4], [4,4,3,4,3,4,3,4,3,4,3,4,3,3,4,4] ], [ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3] ] ] } 

Si esto es un error en Swift, estoy tratando de encontrar una forma de hacerlo, así que puedo hacer que esto funcione.

Parece que SKPhysicsBody está instanciado con un tamaño vacío. Intenta crear el object de cuerpo de física con un tamaño explícito, como sigue:

 var physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(100, 100)) 

Alternativamente, puede establecer el tamaño directamente en el SKSpriteNode o usar uno de sus constructores que toma una construcción initWithTexture:color:size: como initWithTexture:color:size: