swift sprite-kit skspritenode skscene skreferencenode

swift - Agregue SKReferenceNode/SKScene a otro SKScene en SpriteKit



sprite-kit skspritenode (1)

Me gustaría agregar un SKScene a mi GameScene principal. SKReferenceNode parece ser una buena solución.

Tengo: - GameScene.sks (escena principal) - Countdown.sks (escena para agregar a GameScene) - Countdown.swift (clase personalizada, ¿cómo se inicia? SKScene? SKReferenceNode? SKNode)

No sé cómo agregar programáticamente mi cuenta atrás utilizando mi clase Cuenta atrás.

Lo intenté:

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)

Pero tengo el siguiente error:

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

También probé algo más simple como:

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

Pero no sé cómo iniciar la clase usando el archivo Countdown.sks.

Sé que también tengo la posibilidad de crear una clase SKNode e iniciarla al 100% mediante programación, pero es realmente importante para mí usar el archivo .sks asociado para usar el editor de escena Xcode.


Hago eso, no sé si es la mejor manera de hacerlo, pero funciona:

Tengo 2 archivos Dragon.swift y sks

He agregado un nodo "principal" como DragonNode y otros hijos de nodo de este

Ahora, DragonNode es una clase personalizada, configúralo en el archivo sks:

DragonNode es un SKSpriteNode normal

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

Dentro de la escena, agrega un SKReferenceNode:

En el código 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() es una extensión para encontrar su nodo basado (el primero)

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