2016-09-08 5 views
2

Je voudrais ajouter un SKScene à mon GameScene principal. SKReferenceNode semble être une bonne solution.Ajouter SKReferenceNode/SKScene à un autre SKScene dans SpriteKit

J'ai: - GameScene.sks (scène principale) - Countdown.sks (scène à ajouter à GameScene) - Countdown.swift (classe personnalisée, comment il fait pour initialiser SKScene SKReferenceNode SKNode??)

Je ne sais pas comment ajouter par programme mon compte à rebours en utilisant mon compte à rebours de classe.

J'ai essayé:

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) 

Mais j'ai l'erreur suivante:

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

J'ai aussi essayé quelque chose de plus simple comme:

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

Mais je ne sais pas comment init de la classe en utilisant le fichier Countdown.sks.

Je sais que j'ai aussi la possibilité de créer une classe SKNode, et init 100% par programmation, mais il est vraiment important pour moi d'utiliser le fichier .sks associé afin d'utiliser l'éditeur de scène Xcode.

+0

Sons comme vous compte à rebours est en utilisant la mise à jour de func? Parce que vous ne pouvez pas ajouter 2 SKScene en un, mais vous pouvez sous-classer Countdown comme SKSpriteNode ou SKNode et l'utiliser dans SKReferenceNode –

+0

@SimonePistecchia J'ai essayé "class Countdown: SKReferenceNode", si je sous-classe dans SKNode, comment puis-je faire pour créer et init mon noeud en utilisant le fichier sks? – cmii

Répondre

5

je fais ça, je ne sais pas si est la meilleure façon de le faire, mais fonctionne:

J'ai 2 fichiers Dragon.swift et SKS

enter image description here

Je avons ajouté un nœud « principal » comme DragonNode et d'autres enfants de ce noeud

enter image description here

maintenant, la DragonNode est une classe personnalisée, réglez en fichier SKS:

enter image description here

Le DragonNode est une SKSpriteNode normale

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() {} 
} 

l'intérieur de la scène, ajoutez un SKReferenceNode:

enter image description here

Dans le code SKScene:

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() est une extension pour trouver votre noeud en fonction (le premier un)

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

Extension intéressante –