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}
}
}