Swift 从GameViewController更改SKReferenceNode

Swift 从GameViewController更改SKReferenceNode,swift,xcode,sprite-kit,skreferencenode,Swift,Xcode,Sprite Kit,Skreferencenode,我正在使用SpriteKit框架开发一个Swift游戏。在这个应用程序中,我有GameSecene.sks,其中显示了我的UI。在该.sks文件中,底部菜单有一个SKReferenceNode。如果用户在iPhone X上运行游戏,底部菜单将改变其高度 然而,我在这一点上遇到了一些困难。我将菜单设置为SKReferenceNode,因为它在多个场景中使用-因此如果我更改菜单,它将在所有场景中更改(GameSecene.sks、GameScene1.sks、GameScene2.sks等等) 什么

我正在使用SpriteKit框架开发一个Swift游戏。在这个应用程序中,我有GameSecene.sks,其中显示了我的UI。在该.sks文件中,底部菜单有一个SKReferenceNode。如果用户在iPhone X上运行游戏,底部菜单将改变其高度

然而,我在这一点上遇到了一些困难。我将菜单设置为SKReferenceNode,因为它在多个场景中使用-因此如果我更改菜单,它将在所有场景中更改(GameSecene.sks、GameScene1.sks、GameScene2.sks等等)


什么是最好的方法来处理这个问题?如果这是一个显而易见的问题,我很抱歉,但我一直在瞎琢磨这个问题。

你做得很好,我也会将菜单用作参考节点。但是,您不需要在GameViewController中对其进行更改即可获得所需的结果

在需要RefNode的外观依赖于某些变量的情况下,我会做什么?我不会在所需的init中加载外观

通常在RefNode类内部,我会这样做

class SomeObject: SKSpriteNode {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        setup()
    }

    func setup() {
        //setup objects in here
    }
}
但是,当我需要修改演示文稿时,我会在所需的init中注释掉setup调用

然后从我的游戏场景中的初始化代码调用setup

class SomeObject: SKSpriteNode {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)    
        //setup()
    }

    func setup(height: CGFloat) {

        //setup objects in here
        if let background = self.childNode(withName: "//background") as? SKSpriteNode {
            self. background = background
            background.size.height = height
        }
    }
}
func createSomeObject() {

    if let someObjectNode = self.childNode(withName: "//someObjectNode") as? SKReferenceNode {

        someObject = someObjectNode(withName: "//someObjectNode") as? SomeObject

        //you can figure out this multiple ways
        if isIpad {
            height = 50
        }
        else if isIphoneX {
            height = 250
        }
        someObject.setup(height: height)
    }
}
然后在游戏场景中

class SomeObject: SKSpriteNode {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)    
        //setup()
    }

    func setup(height: CGFloat) {

        //setup objects in here
        if let background = self.childNode(withName: "//background") as? SKSpriteNode {
            self. background = background
            background.size.height = height
        }
    }
}
func createSomeObject() {

    if let someObjectNode = self.childNode(withName: "//someObjectNode") as? SKReferenceNode {

        someObject = someObjectNode(withName: "//someObjectNode") as? SomeObject

        //you can figure out this multiple ways
        if isIpad {
            height = 50
        }
        else if isIphoneX {
            height = 250
        }
        someObject.setup(height: height)
    }
}

您需要根据SKReferenceNode使用的sks文件的代码隐藏更改高度。X和其他16:9设备之间的高度差可以忽略不计,值得付出努力吗?罗恩,感谢您多次提供解决方案!太好了!但是,当我阅读您的答案时,我必须将“func createSomeObject()”方法添加到我的所有场景中-这是正确的,还是我遗漏了什么?:)是的,在场景中的某个时刻,您可能希望在场景中找到该对象,并将其放入局部变量中,以便可以从场景中的任何位置访问该对象。例如如果是在SKReferenceNode中创建的GameHUD,则将该对象放入局部变量GameHUD中,以便可以从场景访问其属性,如
GameHUD.score=50
这就是createSomeObject函数的全部功能doing@user2026507让我知道这对你是否有效,如果确实如此,请将其标记为正确,以帮助可能存在这些问题的其他人。抱歉,答复太晚。工作起来很有魅力。谢谢你,罗恩!