2016-07-19 52 views
1

ich erhalte „fatale Fehler: unerwartet gefunden null, während einen optionalen Wert auspackt“ im folgenden Codeswift 2 fatale Fehler: unerwartet gefunden, gleich Null, während ein optionalen Wert auspackt - Kategorie Name

let ballCategoryName = "ball" 


class GameScene: SKScene, SKPhysicsContactDelegate { 
    override func didMoveToView(view: SKView) { 

    let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    borderBody.friction = 0 
    self.physicsBody = borderBody 


    let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode 
    ball.position = CGPointMake(self.size.width/2, self.size.height/2) 
    ball.physicsBody?.dynamic = true 
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) 
    ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0)) 

    self.addChild(ball) 

Fehler erscheinen bei „lassen Ball = childNodeWithName (ballCategoryName) wie! SKSpriteNode“ Sich wundern, wenn mir hier jemand helfen könnte heraus, warum das erscheinen hält

+2

Nicht sicher instanziiert können, was Sie fordern hier. Offensichtlich gibt es keinen Kind-Knoten mit dem 'ballCategoryName', den Sie übergeben? – hnh

+0

@hnh Ich bin neu in dieser Art von Code, so dass ich ein wenig verwirrt bin. Was muss getan werden, um ChildNode hinzuzufügen? Entschuldigung, wenn das dumm klingt –

+0

Ohne childNodeWithName zu sehen, ist es wirklich schwieriger zu sagen, was schief läuft. – ldindu

Antwort

0

Sie dieses

ersetzen soll

mit diesem

let ball = SKSpriteNode(imageNamed: "YOUR_IMAGE_NAME") 

Ich schlage vor, Sie auch die SpriteKit Programming Guide lesen.

1

Sie müssen diesen Ball als Knoten erstellen. Sie können einen Knoten wie folgt machen:

let ball = SKSpriteNode(imageNamed: "fileimage.png")

und fügen Sie es dann der Szene hinzu.

Das Problem ist, dass Sie diesen Ball aus dem Nichts erstellen. Unten finden Sie nichts, wenn Sie diese Szene noch nicht erstellt haben. Dieses Kind existiert nicht.

childNodeWithName(ballCategoryName) as! SKSpriteNode

1

Das Problem ist, dass Sie Kraft sind Casting unsafely auf dieser Linie:

let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode 

Verfahren childNodeWithName() entweder ein Sprite-Kit Knoten oder null (SKSpriteNode?) zurückgibt. Das Ausrufezeichen in: as! SKSpriteNode bedeutet, dass Sie sicher sind, dass diese Rückgabe nicht null ist und dass Sie sie als nicht optional SKSpriteNode umwandeln möchten. Es scheint, dass Sie einen Fall gefunden haben, in dem childNodeWithName(.. Nil zurückgegeben hat, sodass das Casting fehlgeschlagen ist und Ihre App abgestürzt ist.

Sie können die optional in einer Vielzahl von Möglichkeiten auspacken, nur zum Beispiel hier ist das, was Ihr Code aussehen würde, wenn Sie if let verwendet:

if let ball = childNodeWithName(ballCategoryName) { 
    ball.position = CGPointMake(self.size.width/2, self.size.height/2) 
    ball.physicsBody?.dynamic = true 
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height/2) 
    ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0)) 
    self.addChild(ball) 
} 

beachten Sie, dass in diesem Beispiel, wenn childNodeWithName(ballCategoryName) kehrt nil den Code innerhalb Der Körper der if-Klausel wird überhaupt nicht laufen.

siehe apple docs für eine ziemlich umfassende Erklärung aller Möglichkeiten, wie Sie optionale Werte auspacken könnte.

abwechselnd als andere Antworten haben gezeigt, Sie Kugel als nicht optionale Instanz von SKSpriteNode mit let ball = SKSpriteNode(imageNamed: "something.png")