改变GameViewController的SKReferenceNode

时间:2018-01-19 16:34:05

标签: swift xcode sprite-kit skreferencenode

我正在使用SpriteKit框架在Swift中开发游戏。在这个应用程序中,我有GameScene.sks我的UI呈现。在该.sks文件中,底部菜单有一个SKReferenceNode。如果用户从iPhone X运行游戏,则底部菜单将改变它的高度。

然而,到达那一点我遇到了一些麻烦。我将菜单设置为SKReferenceNode,因为它在多个场景中使用 - 所以如果我更改菜单,它将在所有场景中更改(GameScene.sks,GameScene1.sks,GameScene2.sks等等......)

最好的方法是什么?我很抱歉,如果这是一个显而易见的问题,但我一直在主演这个问题。

1 个答案:

答案 0 :(得分:1)

你做得很好,使用菜单作为SKReferenceNode也是我会做的。但是,您无需从GameViewController更改它以获得所需的结果。

在我需要RefNode的外观依赖于某些变量的情况下我做了什么我没有在所需的init中加载外观

通常在RefNode类内部我这样做

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

        setup()
    }

    func setup() {
        //setup objects in here
    }
}

但是当我需要改变演示文稿时,我会在所需的init

中注释掉设置调用

然后从我的GameScene

中的初始化代码调用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
        }
    }
}

然后在GameScene

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