【问题标题】:pass / share class with SpriteView GameScene from a SwiftUi View从 SwiftUi 视图中通过 SpriteView GameScene 传递/共享类
【发布时间】:2021-07-13 15:38:31
【问题描述】:

我正在玩 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)
            
    }
    
}

【问题讨论】:

    标签: class swiftui spriteview


    【解决方案1】:

    也许其他人也想这样做?下面是代码sn-ps中的答案

    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?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多