2016-09-08 7 views
2

Ich möchte ein SKScene zu meinem Haupt-GameScene hinzufügen. SKReferenceNode scheint eine gute Lösung zu sein.Hinzufügen von SKReferenceNode/SKScene zu einem anderen SKScene in SpriteKit

ich habe: - GameScene.sks (Hauptszene) - Countdown.sks (Szene zu GameScene hinzufügen) - Countdown.swift (Custom-Klasse, wie funktioniert es init SKScene SKReferenceNode SKNode??)

Ich weiß nicht, wie programmgesteuert meinen Countdown mit meiner Klasse Countdown hinzufügen.

Ich habe versucht:

let path = Bundle.main.path(forResource: "Countdown", ofType: "sks") 
let cd = SKReferenceNode (url: NSURL (fileURLWithPath: path!) as URL) as! Countdown 
cd.name = "countdown" 
self.addChild(cd) 

Aber ich habe die folgende Fehlermeldung:

Could not cast value of type 'SKReferenceNode' (0x10d97ad88) to 'LYT.Countdown' (0x10a5709d0 

Ich habe auch versucht, etwas einfacher wie:

let cd=Countdown(scene:self) 
self.addChild(cd) 

Aber ich weiß nicht, wie Initiieren der Klasse mithilfe der Countdown.sks-Datei.

Ich weiß, ich habe auch die Möglichkeit, eine SKNode-Klasse zu erstellen und 100% programmgesteuert initalisieren, aber es ist wirklich wichtig für mich, die zugehörige .sks-Datei zu verwenden, um den Xcode-Szeneneditor zu verwenden.

+0

Klingt wie Sie Countdown zu finden, ist die Func-Update mit? Weil Sie nicht 2 SKScene in einem hinzufügen können, aber Sie können Countdown wie SKSpriteNode oder SKNode ableiten und in SKReferenceNode verwenden –

+0

@SimonePistecchia Ich habe versucht "Klasse Countdown: SKReferenceNode", wenn ich es in SKNode ableiten, wie kann ich erstellen und init meinen Knoten mit der SKs-Datei? – cmii

Antwort

5

ich tun, ich weiß nicht, ob der beste Weg, dies zu tun ist, aber funktioniert:

Ich habe 2 Datei Dragon.swift und sks

enter image description here

I‘ hinzugefügt haben setzen einen „Haupt“ Knoten wie DragonNode und anderen Knoten Kinder dieser

enter image description here

nun die DragonNode ist eine benutzerdefinierte Klasse, es in sks-Datei:

enter image description here

Die DragonNode ist ein normaler SKSpriteNode

class DragonNode: SKSpriteNode, Fly, Fire { 

    var head: SKSpriteNode! 
    var body: SKSpriteNode! 
    var shadow: SKSpriteNode! 
    var dragonVelocity: CGFloat = 250 

    required init?(coder aDecoder: NSCoder) {   
     super.init(coder: aDecoder) 

     //Example other node from sks file 
     body = self.childNodeWithName("Body") as! SKSpriteNode 
     head = body.childNodeWithName("Head") as! SKSpriteNode 
     shadow = self.childNodeWithName("Shadow") as! SKSpriteNode 
     shadow.name = "shadow" 
    } 

    //Dragon Func 
    func fireAction() {} 
    func flyAction() {} 
} 

Innerhalb der Szene, fügen Sie ein SKReferenceNode:

enter image description here

Im SKScene Code:

let dragonReference = self.childNodeWithName("DragonReference") as! SKReferenceNode 

    let dragonNode = dragonReference.getBasedChildNode() as! DragonNode 
    print(dragonNode) 
    //Now you can use the Dragon func 
    dragonNode.flyAction() 

getBasedChildNode() ist eine Erweiterung Ihrer Basis-Knoten (die erste)

extension SKReferenceNode { 
    func getBasedChildNode() -> SKNode? { 
     if let child = self.children.first?.children.first {return child} 
     else {return nil} 
    } 
} 
+0

Interessante Erweiterung –

Verwandte Themen