【问题标题】:Trouble using SKReferenceNode programmatically以编程方式使用 SKReferenceNode 时遇到问题
【发布时间】:2017-05-25 14:56:28
【问题描述】:

我正计划制作一款将屏幕分成两半的街机游戏。 每次玩家开始游戏时,这一半的背景都会有所不同。

我想将我的背景设计成不同的 .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 然后将它们的引用设置为单个背景时它都会起作用,但问题是我想随机选择两个每次都不同的背景,所以我必须找到一种方法来以编程方式而不是通过场景编辑器来解决这个问题。

有什么建议吗?

【问题讨论】:

    标签: swift skreferencenode


    【解决方案1】:

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

    在我的例子中,我用 SKScene 替换了 SKReferenceNode。

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

    然后我在我的 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,然后将用于包含 .sks 场景的变量设置为 nil,然后我才将我的 mainNode 添加为我的 GameScene 的子节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多