2016-09-08 8 views
2

Я хотел бы добавить SKScene в свою главную GameScene. SKReferenceNode кажется хорошим решением.Добавить SKReferenceNode/SKScene в другой SKScene в SpriteKit

у меня есть: - GameScene.sks (Главная сцена) - Countdown.sks (сцена добавить в GameScene) - Countdown.swift (Пользовательский класс, как же инициализировать его SKScene SKReferenceNode SKNode??)

Я не знаю, как добавить программный обратный отсчет, используя мой класс Countdown.

Я пробовал:

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) 

Но я следующее сообщение об ошибке:

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

я пытался что-то более простое, как:

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

Но я не знаю, как для запуска класса с использованием файла Countdown.sks.

Я знаю, что у меня также есть возможность создать класс SKNode и инициализировать его на 100% программно, но для меня очень важно использовать связанный с ним файл .sks, чтобы использовать редактор сцены Xcode.

+0

звучит, как вы Countdown использует обновление Func? Поскольку вы не можете добавить 2 SKScene в один, но вы можете подклассировать Countdown как SKSpriteNode или SKNode и использовать его внутри SKReferenceNode –

+0

@SimonePistecchia Я пробовал «класс Обратный отсчет: SKReferenceNode», если я подклассифицирую его в SKNode, как сделать, чтобы создать и запустить мой узел с помощью файла sks? – cmii

ответ

5

я могу это сделать, я не знаю, если это лучший способ сделать это, но работает:

Я 2 файла Dragon.swift и SKS

enter image description here

Я ве добавил «главный» узел как DragonNode и других узлов детей этого

enter image description here

Теперь DragonNode это пользовательский класс, установить его в SKS файл:

enter image description here

DragonNode нормальный 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() {} 
} 

Внутри сцены, добавьте SKReferenceNode:

enter image description here

В коде 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() является расширением, чтобы найти ваш основанный узел (первый)

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

Интересное расширение –