Mostra SpriteKit punteggio in SwiftUI Vista

0

Domanda

Sto cercando di fare un ZStack di sovrapposizione il Punteggio ottenuto da mio SpriteKit scena. Ho il seguente codice per adesso funziona mostrando il codice all'interno della realtà della scena, ma voglio mostrare nella Vista

import SwiftUI
import SpriteKit

var gameScore = 0

class GameScene: SKScene, SKPhysicsContactDelegate {

let removeLabel = SKAction.sequence([SKAction.fadeIn(withDuration: 0.3), SKAction.wait(forDuration: 0.8), SKAction.fadeOut(withDuration: 0.3)])

override func sceneDidLoad() {
    super.sceneDidLoad()
}

Ecco la funzione:

// MARK: - Add Score
func addScore(){
    if gameScore < 250 {
        gameScore += 1
        scoreLabel.text = String(format: "%06d", gameScore)
        let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]
        
        if possibleScores.contains(gameScore) {
            startNewLevel()
        }
    } else {
        gameScore += 2
        scoreLabel.text = String(format: "%06d", gameScore)
        let possibleScores: Set = [10, 20, 30, 40, 50, 65, 80, 95, 110, 125, 150, 175, 200, 250]
        
        if possibleScores.contains(gameScore) {
            startNewLevel()
        }
    }
}

Il mio punto di Vista codice simile a questo:

import SwiftUI
import SpriteKit

struct PageTwo: View {

@State var gameScore = 0

var body: some View {
    ZStack {
        GameView()
        ZStack {
            Text("Score: \(gameScore)")
                .foregroundColor(.white)
      }
    }
  }
}

Sta mostrando il Punteggio, ma non conta, così magari qualcuno mi può dire dove sto andando di sbagliato qui? Questo SpriteKit + SwiftUI è nuovo per me e non ancora del tutto capito.

sprite-kit swiftui
2021-11-23 16:22:40
1

Migliore risposta

0

È necessario utilizzare ObservableObject e di un editore che, ho guardato il codice, c'è una parte di codice sorgente mancante, come sempre, è un esempio per voi:

class GameScene: SKScene, SKPhysicsContactDelegate, ObservableObject {  // <<: Here 1
    
    @Published var gameScore = 0 // <<: Here 2
    
    let removeLabel = SKAction.sequence([SKAction.fadeIn(withDuration: 0.3), SKAction.wait(forDuration: 0.8), SKAction.fadeOut(withDuration: 0.3)])
    
    override func sceneDidLoad() {
        super.sceneDidLoad()
    }
    
    func addScore(){
        if gameScore < 250 {
            gameScore += 1
            
        } else {
            gameScore += 2
            
        }
    }
    
}



struct PageTwo: View {
    
    @StateObject var gameScene: GameScene = GameScene() // <<: Here 3
    
    var body: some View {
        
        Text("Score: \(gameScene.gameScore)") // <<: Here 4
            .onTapGesture {
                gameScene.addScore()  // <<: Here 5
            }
        
    }
    
}
2021-11-23 17:10:39

Purtroppo questo non cambia le cose, ma penso che mi ha fatto più vicino. Di cosa si tratta, tuttavia, di non fare è contare il punteggio. Dovrebbe addScore() ogni volta che un asteroide è distrutto. So che il tutto possa essere utile, ma è un sacco di codice. Io sono fondamentalmente ricostruendo il mio gioco in modo che l'interfaccia utente è 100% SwiftUI e la logica SpriteKit.
Norbert

Hai provato il mio dato i codici di risposta? a me funziona. Ed è un modo per, come ho detto non ho accesso al tuo progetto e penso che non produce nessun cambiamento nella mia risposta. Non c'è altro modo per voi, per tutti è la mia risposta. Il modo è usare la ObservableObject.
swiftPunk

Penso che l'ultimo pezzo del puzzle è che l' .onTapGesture non è giusto, perché io non voglio addScore() onTapGesture, ma piuttosto quando il proiettile colpisce l'asteroide. Il resto del tuo codice funziona, causa l'ho testato con onAppear
Norbert

Chi l'ha detto che si deve usare .onTapGesture nel progetto! Si tratta di un esempio di test che si può leggere/wright di classe! perché miscelando il codice di prova con il vostro progetto. nessuna idea! Il problema non è SwiftUI o SpriteKit, avete bisogno di imparare a prima! ps: a proposito di chiamare la funzione di addScore() è possibile chiamare quando mai e dove vuoi, il tuo ultimo commento in mostra hanno problema di base per la codifica.
swiftPunk

So che il tuo esempio di codice di test, e che ha funzionato. Devo solo capire come conte ora con la logica del gioco in swiftui.
Norbert

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................