通过 SwiftUi 视图与 SpriteView GameScene 传递/共享 class
pass / share class with SpriteView GameScene from a SwiftUi View
我正在玩 SpriteView,效果很好。但是我不知道如何与 Spritekit GameScene 共享 class,这是在我的一个视图中实例化的。与其他视图分享我的 class 就像一个魅力。但是我如何从 spritekit 的 GameScene 访问我的 gameCenterManager class ,我如何传递 class ?我不知道如何做到这一点。我考虑过制作一个全球可访问的 class,但这不是我想要的。
目标是能够从 GameScene 内部发送和接收数据以更新玩家位置等。但是匹配发生在 SwiftUI 视图中,这也是创建 class 的地方。
gameCenterManger class 是这样创建的;
struct ContentView: View {
@StateObject var gameCenterManager = GameCenterManager()
var body: some View {
...
etc
class 设置如下:
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 是我想要跨所有视图和 SKScenes
访问的 class
在主视图中:
@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?
我正在玩 SpriteView,效果很好。但是我不知道如何与 Spritekit GameScene 共享 class,这是在我的一个视图中实例化的。与其他视图分享我的 class 就像一个魅力。但是我如何从 spritekit 的 GameScene 访问我的 gameCenterManager class ,我如何传递 class ?我不知道如何做到这一点。我考虑过制作一个全球可访问的 class,但这不是我想要的。
目标是能够从 GameScene 内部发送和接收数据以更新玩家位置等。但是匹配发生在 SwiftUI 视图中,这也是创建 class 的地方。
gameCenterManger class 是这样创建的;
struct ContentView: View {
@StateObject var gameCenterManager = GameCenterManager()
var body: some View {
...
etc
class 设置如下:
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 是我想要跨所有视图和 SKScenes
访问的 class在主视图中:
@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?