2016-10-20 1 views
0

Ich möchte Boxen erstellen, und wenn Sie die Boxen mit der Kugel treffen, verschwindet die Box, die Sie getroffen haben.Spritekit - Beenden mit nicht abgefangener Ausnahme vom Typ NSException

Ich kann es machen, indem Sie eine einzelne Box in einer Funktion machen. Aber wenn ich eine Funktion mit einer For-Schleife mache, um mehrere Boxen zu erstellen, stürzt die App ab. Wenn ich die Variable SpriteKitNode innerhalb der Funktion mache, werden die Kästchen korrekt angezeigt, verschwinden jedoch nicht, wenn Sie sie mit der Kugel treffen. Jetzt mache ich die Variable außerhalb der Funktion, und die App wird abstürzen, wenn ich das Projekt ausführen.

import SpriteKit 

struct PhysicsCategory { 
static let Enemy : UInt32 = 1 
static let Bullet : UInt32 = 2 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

var mainAnimation = SKSpriteNode(imageNamed: "Spaceship") 
var squareAnimation = SKSpriteNode(imageNamed: "Squares") 

override func didMove(to view: SKView) { 

    physicsWorld.contactDelegate = self 

    makeBanners() 
    spaceshipPosition() 
    makeSquares(numberOfSquaresInRow: 5, numberOfRows: 4, squareRadius: 5, rowSpacing: 40, yStart: 120) 
} 

Und die Funktion, wo ich den Fehler übernehmen ist

func makeSquares (numberOfSquaresInRow: Int, numberOfRows: Int, squareRadius: CGFloat, rowSpacing: CGFloat, yStart: CGFloat) { 

    for rowNumber in 0...(numberOfRows - 1) { 
     let squareSpacing = (self.frame.size.width - (CGFloat(numberOfSquaresInRow) * squareRadius * 2))/CGFloat(numberOfSquaresInRow + 1) 

     var extraSpacing = CGFloat(0) 
     if rowNumber % 2 == 1 { 
      extraSpacing = squareSpacing/2 
     } 

     for squareNumber in 0...(numberOfSquaresInRow - 1) { 

      squareAnimation.size = CGSize(width: 30, height: 30) 

      let xPosition : CGFloat = extraSpacing + squareSpacing + squareRadius + (squareRadius * 2 * CGFloat(squareNumber)) + (squareSpacing * CGFloat(squareNumber)) 

      let yPosition : CGFloat = yStart + (CGFloat(rowNumber) * squareSpacing) 

      squareAnimation.position = CGPoint(x: xPosition, y: yPosition) 

      squareAnimation.physicsBody = SKPhysicsBody(circleOfRadius: squareRadius) 

      squareAnimation.physicsBody?.categoryBitMask = PhysicsCategory.Enemy 
      squareAnimation.physicsBody?.contactTestBitMask = PhysicsCategory.Bullet 

      squareAnimation.physicsBody?.affectedByGravity = false 
      squareAnimation.physicsBody?.isDynamic = false 

      self.addChild(squareAnimation) 
     } 
    } 
} 

Natürlich ist dies nicht alle Codes. Lass es mich wissen, wenn du mehr brauchst.

Antwort

1

Normalerweise, wenn Sie einen Fehler wie erfüllen:

Terminating app due to uncaught exception 'NSInvalidArgumentException' es anschließend: Grund .. so sind Sie in der Lage sein zu verstehen, was zu einem Projekt passiert ist, aber hier denke ich, das Problem ist, dass Sie auch hinzufügen oft derselbe Knoten mit:

self.addChild(squareAnimation) 

so dass die Compiler gehen zum Absturz zu bringen, weil Sie gerade diesen Knoten zum ersten Mal im Zyklus hinzugefügt haben.

zu lösen Sie sofort eine Zeile hinzufügen könnte, nachdem der für den Zyklus zu sagen Compiler „Hey, ich habe eine neue Eigenschaft, das ist meine Initialisierung ist und dies für jeden Zyklus passieren“:

let squareAnim = SKSpriteNode(imageNamed: "Squares") 

und arbeite mit den restlichen Zeilen mit squareAnim

+0

Wenn ich das self.addChild (squareAnimation) direkt nach der for-Schleife setze, wird es 4 Boxen geben. Besser - aber es sollte 12 sein – jonask

+0

Sie müssen Ihren Code umgestalten, um mehr Felder zu erhalten –

+0

@jonask Sie sollten das addChild nicht außerhalb der for-Schleife verschieben, Sie sollten ein neues quadratisches Sprite als erste Zeile Ihres for erstellen Schleife. Es scheint gerade jetzt quadratischAnimation ist global, das ist sehr gefährlich, wie Sie durch Ihre Fehler sehen können. – Knight0fDragon

Verwandte Themen