2016-05-27 12 views
0

Für ein Puzzle-Spiel-Projekt auf iOS, ich versuche, die SKSpriteNode Klasse von SpriteKit mit dem folgenden Code Unterklasse:ios - Swift 2.2 - SpriteKit - sublassing SKSpriteNode Klasse

class SKPuzzle: SKSpriteNode { 
var name2:String = ""; 
} 

ich andere Variablen in SKSpriteNode hinzufügen müssen wie ein anderer Name (name2) in diesem Fall. Hier ist die Verwendung I der Klasse in einem Klassentyp SKScene gemacht:

class GameScene: SKScene { 

let background = SKSpriteNode(imageNamed: "BW") 
var selectedNode = SKPuzzle() 

override init(size: CGSize) { 
super.init(size: size) 

let imageNames = [sheet.Puzzle13() , sheet.Puzzle19(),sheet.Puzzle30(), 
sheet.Puzzle11(), sheet.Puzzle29(), sheet.Puzzle35() ] 

for i in 0..<imageNames.count { 
let imageName = imageNames[i] 

let sprite = SKPuzzle(texture: imageName) 

sprite.name = kAnimalNodeName 
sprite.name2 = "\(i)" 

let offsetFraction = (CGFloat(i) + 1.0)/(CGFloat(imageNames.count) + 1.0) 

sprite.position = CGPoint(x: size.width * offsetFraction, y: size.height/2) 
sprite.zPosition = 1 

background.addChild(sprite) 

} 

} 

Ich habe das Sprite-Objekt aus der Unterklasse SKPuzzle weicht die neue Variable name2 enthält.

sprite.name2 = "\(i)" 

Das Problem, das ich habe, ist die Variable selectedNode (erstellt mit)

var selectedNode = SKPuzzle() 

später im Programm verwendet werden, enthält immer ein Nullwert für die Datennamen und name2. Wenn ich auf dem Puzzle Teilen des Spiels, bekomme ich folgende Fehlermeldung:

fatale Fehler: unexpectly Null gefunden, während einen optionalen Wert in der folgenden Funktion auspackt:

func panForTranslation(translation : CGPoint) { 

let position = selectedNode.position 

if selectedNode.name! == kAnimalNodeName { 
selectedNode.position = CGPoint(x: position.x + translation.x * 2, y: position.y + translation.y * 2) 


} 
} 

selectedNode scheint, die nur Null-Werte . Der Code funktioniert gut, wenn ich nur den SKSpriteNode benutze, aber mit meiner SKPuzzle-Klasse versagt habe.

Hier wird der gesamte Code des Programms ist:

import SpriteKit 
import UIKit 

private let kAnimalNodeName = "puzzle" 
private let kdancing = "dancing" 

class SKPuzzle: SKSpriteNode { 
var name2:String = ""; 
} 

class GameScene: SKScene { 



let background = SKSpriteNode(imageNamed: "BW") 
var selectedNode = SKPuzzle() 
var selectedVideo = SKVideoNode() 



override init(size: CGSize) { 
super.init(size: size) 

// 1 
self.background.name = kdancing 
self.background.anchorPoint = CGPointZero 
background.zPosition = 0 
self.addChild(background) 
//background.play() 

// 2 
let sheet = Statiques() 

let sprite_dancing1 = SKSpriteNode(texture: sheet.Dancing1()) 
let sprite_dancing2 = SKSpriteNode(texture: sheet.Dancing2()) 
sprite_dancing1.name = kdancing 
sprite_dancing2.name = kdancing 


sprite_dancing1.position = CGPoint(x: 837, y: 752) 
sprite_dancing1.zPosition = 1 
sprite_dancing2.position = CGPoint(x: 1241, y: 752) 
sprite_dancing2.zPosition = 1 

background.addChild(sprite_dancing1) 

background.addChild(sprite_dancing2) 



let imageNames = [sheet.Puzzle13() , sheet.Puzzle19(), sheet.Puzzle30(), sheet.Puzzle11(), sheet.Puzzle29(), sheet.Puzzle35() ] 

for i in 0..<imageNames.count { 
let imageName = imageNames[i] 

let sprite = SKPuzzle(texture: imageName) 

sprite.name = kAnimalNodeName 
sprite.name2 = "\(i)" 

let offsetFraction = (CGFloat(i) + 1.0)/(CGFloat(imageNames.count) + 1.0) 

sprite.position = CGPoint(x: size.width * offsetFraction, y: size.height/2) 
sprite.zPosition = 1 

background.addChild(sprite) 

} 

} 

required init?(coder aDecoder: NSCoder) { 
fatalError("init(coder:) has not been implemented") 
} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    for touch: AnyObject in touches { 
    let positionInScene = touch.locationInNode(self) 
     selectNodeForTouch(positionInScene) 
     } 
} 


override func didMoveToView(view: SKView) { 

    let gestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePanFrom:")) 
    self.view!.addGestureRecognizer(gestureRecognizer) 
} 

func handlePanFrom(recognizer : UIPanGestureRecognizer) { 

    if recognizer.state == .Began { 
     var touchLocation = recognizer.locationInView(recognizer.view) 
     touchLocation = self.convertPointFromView(touchLocation) 

     self.selectNodeForTouch(touchLocation) 
    } else if recognizer.state == .Changed { 
     var translation = recognizer.translationInView(recognizer.view!) 
     translation = CGPoint(x: translation.x, y: -translation.y) 

     self.panForTranslation(translation) 

     recognizer.setTranslation(CGPointZero, inView: recognizer.view) 
    } else if recognizer.state == .Ended { 

    } 
} 

func degToRad(degree: Double) -> CGFloat { 
    return CGFloat(degree/180.0 * M_PI) 
} 

func selectNodeForTouch(touchLocation : CGPoint) { 
    // 1 
    let touchedNode = self.nodeAtPoint(touchLocation) 

    if touchedNode is SKPuzzle { 
     // 2 
     if !selectedNode.isEqual(touchedNode) { 
      selectedNode.removeAllActions() 
      selectedNode.runAction(SKAction.rotateToAngle(0.0, duration: 0.1)) 

      //selectedNode = touchedNode as! SKSpriteNode 

      // 3 
      if touchedNode.name! == kAnimalNodeName { 
       let sequence = SKAction.sequence([SKAction.rotateByAngle(degToRad(-4.0), duration: 0.1), 
        SKAction.rotateByAngle(0.0, duration: 0.1), 
        SKAction.rotateByAngle(degToRad(4.0), duration: 0.1)]) 
       selectedNode.runAction(SKAction.repeatActionForever(sequence)) 
      } 
     } 
    } 
} 



func panForTranslation(translation : CGPoint) { 
    let position = selectedNode.position 

    if selectedNode.name! == kAnimalNodeName { 
     selectedNode.position = CGPoint(x: position.x + translation.x * 2, y: position.y + translation.y * 2) 


    } 
} 

} 

Dank durch Voraus für Ihre Hilfe, ich beginne mit Swift auf iOS zu codieren.

Antwort

0

Wenn selectedNode von SKPuzzle() erstellt wird, ist name Null.

Sie müssen selectedNode.name auf einen Wert in init Methode setzen.