My GameScene reloads whenever my Text view updates

Viewed 110

I have a SwiftUI/SpriteKit project.

I'm using a SwiftUI SpriteView to display my GameScene.

Whenever mainData.numOfBallsInCup is incremented, it updates a Text view.

Here's the problem: When the Text view is updated, it causes GameScene to be reloaded. GameScene's sceneDidLoad() runs each time, and the scene regresses to its initial state.

My ContentView is something like this:

import SwiftUI
import SpriteKit

struct ContentView: View {
    @EnvironmentObject var mainData: MainData
    
    var body: some View {
        GeometryReader { geo in
            Group {
                if mainData.showSpriteScene {
                    SpriteView(scene: GameScene(), transition: SKTransition.reveal(with: .down, duration: 1.0))
                        .ignoresSafeArea()
                    VStack {
                        Text("\(mainData.numOfBallsInCup)")
                            .foregroundColor(Color.white)
                        Text("BALLS")
                            .foregroundColor(Color.white)
                    }
                        .position(x: geo.size.width * 0.5, y: geo.size.height * 0.06)
                }
            }
        }
    }
}

How can I have my Text view updating without reloading my GameScene?

1 Answers

Scene is a model, and you create new scene (right in call) on each update, so SpriteView thinks it should rebuild.

Try the following:

struct ContentView: View {
    @EnvironmentObject var mainData: MainData
    
    @State private var scene = GameScene()  // << here, or put in MainData !!

    var body: some View {
        GeometryReader { geo in
            Group {
                if mainData.showSpriteScene {
                    SpriteView(scene: scene,    // << here !!
                               transition: SKTransition.reveal(with: .down, duration: 1.0))
                        .ignoresSafeArea()
Related