如何解决从 SwiftUi 视图通过 SpriteView GameScene 传递/共享类
我正在玩 SpriteView,它非常好用。但是,我无法弄清楚如何与 Spritekit GameScene 共享一个类,该类在我的视图中实例化。与其他观点分享我的课程就像一种魅力。但是如何从 spritekit 的 GameScene 访问我的 gameCenterManager 类,我该如何传递该类?我不知道如何做到这一点。我考虑过创建一个全局可访问的类,但这不是我想要的。
目标是能够从 GameScene 内部发送和接收数据以更新玩家位置等。但匹配发生在 SwiftUI 视图中,这也是创建类的地方。
gameCentermanger 类就是这样创建的;
struct ContentView: View {
@StateObject var gameCenterManager = GameCenterManager()
var body: some View {
...
etc
课程设置如下:
class GameCenterManager: NSObject,ObservableObject {
//lots of stuff going on
...
}
并共享到将创建 SpriteView 的 GameSceneView 视图,如下所示:
Button("Show Sheet") {
self.showingSheet.toggle()
}
.buttonStyle(RoundedRectangleButtonStyle())
.buttonStyle(ShadowButtonStyle())
.fullScreenCover(isPresented: $showingSheet,content: { GameSceneView(gameCenterManager:self.gameCenterManager)})
最后,在我的 GameSceneView 中,配置了 SpriteView 的 GameScene。
struct GameSceneView: View {
var gameCenterManager: GameCenterManager
@Environment(\.presentationMode) var presentationMode
var scene: SKScene {
let scene = GameScene()
scene.size = CGSize(width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height)
scene.scaleMode = .fill
return scene
}
var body: some View {
Button("dismiss") {
self.presentationMode.wrappedValue.dismiss()
}
Button("send data") {
gameCenterManager.increment()
}
SpriteView(scene: scene )
.frame(width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height - 200 )
.ignoresSafeArea()
.overlay(ImageOverlay(),alignment: .bottomTrailing)
}
}
解决方法
也许其他人也想这样做?以下是代码片段中的答案
GameCenterManager 是我想在所有视图和 SKScene 中访问的类
在主视图中:
@main
struct gameTestApp: App {
@StateObject var gameCenterManager = GameCenterManager()
var body: some Scene {
WindowGroup {
ContentView().environmentObject(gameCenterManager)
}
}
}
在 Contentview 视图中添加:
@EnvironmentObject var gameCenterManager:GameCenterManager
然后我在 Contentview 中转换到 GameSceneView,这将加载我的 SKScene
Button("Show Sheet") {
self.showingSheet.toggle()
}
.buttonStyle(RoundedRectangleButtonStyle())
.buttonStyle(ShadowButtonStyle())
.fullScreenCover(isPresented: $showingSheet,content: { GameSceneView()})
然后在 GameSceneView 添加:
@EnvironmentObject var gameCenterManager:GameCenterManager
以及我们加载 SKScene 的位置:
var scene: SKScene {
let scene = GameScene()
scene.size = CGSize(width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height)
scene.scaleMode = .fill
scene.gameCenterManager = gameCenterManager
return scene
}
最后在 GameScene 中添加:
var gameCenterManager: GameCenterManager?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。