无法以编程方式使用SKReferenceNode

时间:2017-01-10 23:35:10

标签: swift skreferencenode

我打算制作一个街机游戏,将屏幕分成两半。 每当玩家开始游戏时,这半个背景中的每一个都会有所不同。

我想将我的背景设计成不同的.sks文件,然后通过编程方式使用SKReferenceNode将其中两个随机加载到我的GameScene中。

问题是sks内容被视为SKScene,因此它显然不能作为我的场景的孩子添加:

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        let upperBackground = SKReferenceNode(fileNamed: "Caribbeans")!
        addChild(upperBackground)
    }
}

我想知道是否有办法让编译器将我的SKReferenceNode视为SKSpriteNode,但由于SKReferenceNode和SKSpriteNode不相关,尝试向下转换并不起作用。

我知道无论什么时候我创建一个更大的sks场景,拖动两个SKReferenceNodes,然后将它们的引用设置为单个背景,但问题是我想随机选择两个背景,每次都会变化,所以我必须找到一种方法来以编程方式解决这个问题,而不是通过场景编辑器。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

正如我在另一篇文章中提到的,我找到了一种解决方法。

就我而言,我用SKScene替换了SKReferenceNode。

我首先确保在我的.sks场景中,所有SKSpriteNodes都是一个主节点的子节点。它不必是直接链接,您仍然可以尊重场景的层次结构,但重要的是在“层次结构树”的末尾它们链接到一个节点,在我的情况下是背景,但是它也可以是一个空节点。

enter image description here

在我的GameScene文件中,我编写了以下代码:

class GameScene: SKScene {
    var mainNode: SKNode? = nil
    override func didMove(to view: SKView) {
        var mySksScene = SKScene(fileNamed: "Caribbeans")
        mainNode = upperBackground?.childNode(withName: "backgroundCaribbean")
        mainNode?.removeFromParent()
        mySksScene = nil
        addChild(mainNode)
    }
}

我首先声明了一个可选的SKNode变量。然后,在didMove(:to :)中,我将.sks文件加载到可选的SKScene()变量中。然后我将SKNode设置为主节点,该节点是所有其他节点的父节点(在我的例子中:backgroundCaribbean)。然后我从我的父场景中删除了我的mainNode,然后设置为nil用于包含.sks场景的变量,只有那时我将我的mainNode添加为我的GameScene的Child。