在 SpriteView 中绑定的 SKScene

问题描述

我已经创建了一个 SpriteKit 场景文件和相应的 SKScene 对象。该场景对象包含一个 @Binding 属性

当我在 SwiftUI 文件中使用 SpriteView 时,我不知道如何初始化场景,以便它从 sks 文件加载并分配绑定。

我想要这样的东西:

class MyScene: SKScene {
    @Binding var foo: CGFloat

    init(foo: Binding<CGFloat>) {
      _foo = foo
      super.init(fileNamed: "MyScene")
    }
}

但这不起作用,因为 init(fileNamed:)一个便利的初始化器,而不是一个指定的初始化器。

解决方法

使用 ObservableObject 订阅 foo 的可能解决方法。我传递了一个文件名,所以我有借口调用我的便利初始化程序。

class MyScene: SKScene,ObservableObject {
    @Published var foo: CGFloat = 0

    convenience init(fileName: String) {
      self.init(fileNamed: fileName)!
    }
}

然后在您的视图(或其他地方)中引用它。

struct MyView: View {

    @ObservedObject var scene = MyScene(fileName: "MyScene")

    var body: some View {
        VStack {
            FooView($scene.foo)
            SpriteView(scene: scene)
        }
    }
}