1

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

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

解决这个问题的最佳方法是什么?如果这是一个明显的问题,我很抱歉,但我一直在看这个问题。

4

1 回答 1

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 中注释掉 setup 调用

然后从我的 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)
    }
}
于 2018-01-19T18:37:43.623 回答