0

我的场景是这样呈现的

struct GameView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
    func scene(size:CGSize) -> SKScene {
        let scene = GameScene()
        scene.size = size
        scene.scaleMode = .fill
        scene.physicsWorld.gravity = CGVector.zero
        return scene
    }
    
    var body: some View {
        GeometryReader { geometry in
            if #available(iOS 14.0, *) {
                SpriteView(scene: self.scene(size:geometry.size))
                    .edgesIgnoringSafeArea(.all)
            } else {
                // Fallback on earlier versions
                Text("Game Only available from iOS 14")
            }
        }
        .navigationTitle("")
        .navigationBarHidden(true)
    }
}

在其他非 spriteKit 视图中,我曾经self.presentationMode.wrappedValue.dismiss()导航回上一页。一旦从场景中触发游戏结束,在这种情况下我可以做类似的事情吗?(所有视图都在导航视图中)

4

1 回答 1

0

有点。我认为目前您无法做到这一点,但我为我的游戏所做的(我不确定这是否是良好的编码实践)正在使用 ViewManager。

ViewManager 所做的是通过包含一个或多个视图的布尔值将某些视图设置为隐藏或可见。bool 值在场景内发生变化,并反映到 swiftui。

这是一个例子:

class ViewManager: ObervableObject {

    @Published private var exitView = false

    public static var shared = ViewManager()

    privat init() { }
}

class level: SKScene {
    /*Game Code*/
    override func update(_ currenTime: Interval) {
        if /*end level condition*/ {
            ViewManager.shared.exitView = true
        }
    }
}

struct GameView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @StateObject private var viewManager = ViewManager.shared

    /*your code here*/

    var body: some View {
        ZStack {
            /*SpriteView*/
            if viewManager.exitView {
                Button {
                    presentationMode.wrappedValue.dismiss()
                    viewManager.exitView = false
                } label: {
                    Image(systemName: "arrow.uturn.left")
                }
            }
        }
    }
}

ViewManager 更像是一种解决方法,它有很大帮助。

于 2021-05-04T16:19:58.377 回答