我的场景是这样呈现的
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()
导航回上一页。在这种情况下,是否有类似的事情可以在游戏结束时从场景中触发?(所有视图都在导航视图中)
发布于 2021-05-05 00:19:58
说大也大吧。我不认为目前你可以做到这一点,但我为我的游戏所做的(我不确定这是否是很好的编码练习)是使用ViewManager。
ViewManager所做的是通过包含一个或多个视图的布尔值,将某些视图设置为隐藏或可见。布尔值从场景内部更改,并反映到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更像是一种变通方法,它有很大的帮助。
https://stackoverflow.com/questions/63013003
复制相似问题